Linux設備驅動之Framebuffer
寫LCD驅動步驟:
1. 分配一個fb_info結構體: framebuffer_alloc
2. 設置
3. 註冊: register_framebuffer
4. 硬件相關的操作
一、
static struct fb_info *s3c_lcd;
static int lcd_init(void)
{
/* 1. 分配一個fb_info */
s3c_lcd = framebuffer_alloc(0, NULL);
/* 2. 設置 */
/* 2.1 設置固定的參數 */
/* 2.2 設置可變的參數 */
/* 2.3 設置操作函數 */
/* 2.4 其他的設置 */
/* 3. 硬件相關的操作 */
/* 3.1 配置GPIO用於LCD */
/* 3.2 根據LCD手冊設置LCD控制器, 比如VCLK的頻率等 */
/* 3.3 分配顯存(framebuffer), 並把地址告訴LCD控制器 */
/* 4. 註冊 */
register_framebuffer(s3c_lcd);
return 0;
}
static void lcd_exit(void)
{
}
static struct fb_ops s3c_lcdfb_ops = {
.owner = THIS_MODULE,
// .fb_setcolreg = atmel_lcdfb_setcolreg,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
};
static struct fb_info *s3c_lcd;
static int lcd_init(void)
{
/* 1. 分配一個fb_info */
s3c_lcd = framebuffer_alloc(0, NULL);
/* 2. 設置 */
/* 2.1 設置固定的參數 */
strcpy(s3c_lcd->fix.id, "mylcd");
s3c_lcd->fix.smem_len = 240*320*16/8;
s3c_lcd->fix.type = FB_TYPE_PACKED_PIXELS;
s3c_lcd->fix.visual = FB_VISUAL_TRUECOLOR; /* TFT */
s3c_lcd->fix.line_length = 240*2;
/* 2.2 設置可變的參數 */
s3c_lcd->var.xres = 240;
s3c_lcd->var.yres = 320;
s3c_lcd->var.xres_virtual = 240;
s3c_lcd->var.yres_virtual = 320;
s3c_lcd->var.bits_per_pixel = 16;
/* RGB:565 */
s3c_lcd->var.red.offset = 11;
s3c_lcd->var.red.length = 5;
s3c_lcd->var.green.offset = 5;
s3c_lcd->var.green.length = 6;
s3c_lcd->var.blue.offset = 0;
s3c_lcd->var.blue.length = 5;
s3c_lcd->var.activate = FB_ACTIVATE_NOW;
/* 2.3 設置操作函數 */
s3c_lcd->fbops = &s3c_lcdfb_ops;
/* 2.4 其他的設置 */
//s3c_lcd->pseudo_palette =; //
//s3c_lcd->screen_base = ; /* 顯存的虛擬地址 */
s3c_lcd->screen_size = 240*324*16/8;
/* 3. 硬件相關的操作 */
/* 3.1 配置GPIO用於LCD */
/* 3.2 根據LCD手冊設置LCD控制器, 比如VCLK的頻率等 */
/* 3.3 分配顯存(framebuffer), 並把地址告訴LCD控制器 */
//s3c_lcd->fix.smem_start = xxx; /* 顯存的物理地址 */
/* 4. 註冊 */
register_framebuffer(s3c_lcd);
return 0;
}
static void lcd_exit(void)
{
}
三、硬件相關操作設置