319
175 * bit[13:6] : VFPD, 发出最后一行数据之后,再过多长时间才发出VSYNC
176 * LCD手册T2-T5=322-320=2, 所以VFPD=2-1=1
177 * bit[5:0] : VSPW, VSYNC信号的脉冲宽度, LCD手册T1=1, 所以VSPW=1-1=0
178 */
179 lcd_regs->lcdcon2 = (3<<24) | (319<<14) | (1<<6) | (0<<0);
180
181
182 /* 水平方向的时间参数
183 * bit[25:19]: HBPD, VSYNC之后再过多长时间才能发出第1行数据
184 * LCD手册 T6-T7-T8=17
185 * HBPD=16
186 * bit[18:8]: 多少列, 240, 所以HOZVAL=240-1=239
187 * bit[7:0] : HFPD, 发出最后一行里最后一个象素数据之后,再过多长时间才发出HSYNC
188 * LCD手册T8-T11=251-240=11, 所以HFPD=11-1=10
189 */
190 lcd_regs->lcdcon3 = (16<<19) | (239<<8) | (10<<0);
191
192 /* 水平方向的同步信号
193 * bit[7:0] : HSPW, HSYNC信号的脉冲宽度, LCD手册T7=5, 所以HSPW=5-1=4
194 */
195 lcd_regs->lcdcon4 = 4;
196
197 #else
198 lcd_regs->lcdcon2 = S3C2410_LCDCON2_VBPD(5) | \
199 S3C2410_LCDCON2_LINeva l(319) | \
200 S3C2410_LCDCON2_VFPD(3) | \
201 S3C2410_LCDCON2_VSPW(1);
202
203 lcd_regs->lcdcon3 = S3C2410_LCDCON3_HBPD(10) | \
204 S3C2410_LCDCON3_HOZVAL(239) | \
205 S3C2410_LCDCON3_HFPD(1);
206
207 lcd_regs->lcdcon4 = S3C2410_LCDCON4_MVAL(13) | \
208 S3C2410_LCDCON4_HSPW(0);
209
210 #endif
211 /* 信号的极性
212 * bit[11]: 1=565 format
213 * bit[10]: 0 = The video data is fetched at VCLK falling edge
214 * bit[9] : 1 = HSYNC信号要反转,即低电平有效
215 * bit[8] : 1 = VSYNC信号要反转,即低电平有效
216 * bit[6] : 0 = VDEN不用反转
217 * bit[3] : 0 = PWREN输出0
218 * bit[1] : 0 = BSWP
219 * bit[0] : 1 = HWSWP 2440手册P413
220 */
221 lcd_regs->lcdcon5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (1<<0);
222
223 /* 3.3 分配显存(framebuffer), 并把地址告诉LCD控制器 */
224 s3c_lcd->screen_base = dma_alloc_writecombine(NULL, s3c_lcd->fix.smem_len, &s3c_lcd->fix.smem_start, GFP_KERNEL);
225
226 lcd_regs->lcdsaddr1 = (s3c_lcd->fix.smem_start >> 1) & ~(3<<30);
227 lcd_regs->lcdsaddr2 = ((s3c_lcd->fix.smem_start + s3c_lcd->fix.smem_len) >> 1) & 0x1fffff;
228 lcd_regs->lcdsaddr3 = (240*16/16); /* 一行的长度(单位: 2字节) */
229
230 //s3c_lcd->fix.smem_start = xxx; /* 显存的物理地址 */
231 /* 启动LCD */
232 lcd_regs->lcdcon1 |= (1<<0); /* 使能LCD控制器 */
233 lcd_regs->lcdcon5 |= (1<<3); /* 使能LCD本身 */
234 *gpbdat |= 1; /* 输出高电平, 使能背光 */
235
236 /* 4. 注册 */
237 register_framebuffer(s3c_lcd);
238
239 return 0;
240 }
241
242 static void lcd_exit(void)
243 {
244 unregister_framebuffer(s3c_lcd);
245 lcd_regs->lcdcon1 &= ~(1<<0); /* 关闭LCD本身 */
246 *gpbdat &= ~1; /* 关闭背光 */
247 dma_free_writecombine(NULL, s3c_lcd->fix.smem_len, s3c_lcd->screen_base, s3c_lcd->fix.smem_start);
248 iounmap(lcd_regs);
249 iounmap(gpbcon);
250 iounmap(gpccon);
251 iounmap(gpdcon);
252 iounmap(gpgcon);
253 framebuffer_release(s3c_lcd);
254 }
255
256 module_init(lcd_init);
257 module_exit(lcd_exit);
258
259 MODULE_LICENSE("GPL");
LCD Code
insmod cfbcopyarea.ko insmod cfbfillrect.ko insmod cfbimgblt.ko insmod lcd.ko
还有一种是系统自带的LCD驱动程序,使用分层分离所写,再来学习!
|