以下各层为从上往下调用关系:用户空间——>内核空间——>硬件
一、用户空间——应用程序
二、内核空间:
1)kernel/driver/video/fbmem.c(母目录,一律注册字符设备,不针对平台)
作用:a. 定义结构体file_operations包括fb_read()、fb_write()、fb_ioctl()等
b. 在module_init()初始化时,调用register_chrdev(FB_MAJOR,"fb",&fb_fops)函数传递该
该结构体以注册字符设备。
如下图:
2)kernel/driver/video/sc8810(视平台而定)/sprdfb_main.c(一般为XX fb_main.c)
作用:注册framebuffer(调用函数在fbmem.c内定义)、注册平台设备
作用:a. 定义结构体platform_driver包括probe、suspend、resume等
b. 在module_init()初始化时,调用platform_driver_register(&sprdfb_driver)函数传递该结
构体“针对该平台”进行平台驱动注册。
如下图:
c. 在该结构体内成员probe函数里调用 register_framebuffer(fb)注册framebuffer,
且在probe探测函数里“针对该平台”进行硬件初始化、申请帧缓冲空间等。
//********************************************
//********************************************
注释:sprdfb_main.c会调用同个目录下lcdc.c文件下函数,进行ID的枚举等,具体参考前一章。
1)通过lcdc.c的find_adapt_from_readid()函数(uboot下也有)会在kernel下重新枚举设
备(如果uboot枚举不通过返回-1)如下图
2)find_adapt_from_readid()和find_adapt_from_uboot区别如下,其中
find_adapt_from_readid()会重新枚举panel如下图灰色区域:
3)a. 图中lcd_panel_size即为枚举数量,函数位置为:
/customize/cutomer_cfg/sp8810ga/kernel/lcd/lcd_cfg.c
或/u-boot/drivers/video/sc8810_fb.c
如下图定义:
b. 其中平台设备函数位置为:
/3rdparty/lcd/lcd_ili9486kernel/lcd_ili9486.c
或/u-boot/board/spreadtrum/sp8810/lcd_ili9486.c
如下图定义:
c. lcd_operations结构体定义如下:
//********************************************
三、硬件——LCD控制器
备注:LCD平时运行函数(属于 fb_ops、 lcd_operations的ops操作函数,为上层软件调用执行):
<4>[ 39.549000] sprdfb pan_display!!,fb_state=0
<4>[ 39.549000] hx8369_invalidate_rect : (0, 0, 479, 799)
<4>[ 39.549000] hx8369_set_window
在kernel读ID如果读取不对,会使fb_state置1,即通过不了sprdfb pan_display(),
一直在调用该函数而不执行hx8369的函数。