itop4412 LCD设备驱动详解(一)之DEVICE
2016-11-05 20:13
579 查看
LCD的工作,在kernel中有device和driver两个描述,这也是必然。
一.先看device
在palt-s5p/dev-fimd-s5p.c
定义了一个 struct platform_device s3c_device_fb 平台设备
struct s3c_platform_fb default_fb_data 该结构体是是设备的 缺省初始化,当然你还可以指定
,靠的就是下面的这个函数
针对上面的s3cfb_set_platdata:
board文件中看到:是否确定参数,如下
来看看时钟: s3cfb_get_clk_name(npd->clk_name);是获得设备时钟name,该函数在
setuo-fb-s5pc.c 中函数原型如下:
一.先看device
在palt-s5p/dev-fimd-s5p.c
定义了一个 struct platform_device s3c_device_fb 平台设备
#ifdef CONFIG_FB_S5P // 选择开关 static struct resource s3cfb_resource[] = { [0] = { .start = S5P_PA_FIMD0, //资源地址 .end = S5P_PA_FIMD0 + SZ_32K - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_FIMD0_VSYNC, //同步中断 .end = IRQ_FIMD0_VSYNC, .flags = IORESOURCE_IRQ, }, [2] = { .start = IRQ_FIMD0_FIFO, //fifo中断 .end = IRQ_FIMD0_FIFO, .flags = IORESOURCE_IRQ, }, }; static u64 fb_dma_mask = 0xffffffffUL; //dma 掩码 struct platform_device s3c_device_fb = { //fb设备定义和描述 .name = "s3cfb", //设备名字 #if defined(CONFIG_ARCH_EXYNOS4) .id = 0, #else .id = -1, #endif .num_resources = ARRAY_SIZE(s3cfb_resource),//指定上面的资源 .resource = s3cfb_resource, .dev = { .dma_mask = &fb_dma_mask, .coherent_dma_mask = 0xffffffffUL } }; 这上面是device 和exynos 相关的lcd寄存器资源和中断, 除了这些还有一些其他的相关信息如下(所以该文件中还有如下:)
static struct s3c_platform_fb default_fb_data __initdata = { #if defined(CONFIG_ARCH_EXYNOS4) .hw_ver = 0x70, #else .hw_ver = 0x62, #endif .nr_wins = 5, //支持的窗口数 #if defined(CONFIG_FB_S5P_DEFAULT_WINDOW) .default_win = CONFIG_FB_S5P_DEFAULT_WINDOW, //指定默认显示窗口 #else .default_win = 0, #endif .swap = FB_SWAP_WORD | FB_SWAP_HWORD, //数据字交换 };
struct s3c_platform_fb default_fb_data 该结构体是是设备的 缺省初始化,当然你还可以指定
,靠的就是下面的这个函数
void __init s3cfb_set_platdata(struct s3c_platform_fb *pd) { struct s3c_platform_fb *npd; int i; if (!pd) //是判断使用缺省配置。 确定因素在boardtiao调用该函数时,是否添加此参数 pd = &default_fb_data; npd = kmemdup(pd, sizeof(struct s3c_platform_fb), GFP_KERNEL); if (!npd) printk(KERN_ERR "%s: no memory for platform data\n", __func__); else { for (i = 0; i < npd->nr_wins; i++) //初始化每个窗口的id npd->nr_buffers[i] = 1; #if defined(CONFIG_FB_S5P_NR_BUFFERS) npd->nr_buffers[npd->default_win] = CONFIG_FB_S5P_NR_BUFFERS; #else npd->nr_buffers[npd->default_win] = 1; #endif //下面这些函数都是在 driver 匹配后,在里面调用 s3cfb_get_clk_name(npd->clk_name); //获取时钟 npd->cfg_gpio = s3cfb_cfg_gpio; //获取引脚操作函数 npd->backlight_on = s3cfb_backlight_on; //开背光 npd->backlight_off = s3cfb_backlight_off; //关背光 npd->lcd_on = s3cfb_lcd_on; //使能lcd设备 npd->lcd_off = s3cfb_lcd_off;//关闭lcd 设备 npd->clk_on = s3cfb_clk_on; // 时钟开 npd->clk_off = s3cfb_clk_off; 时钟关 s3c_device_fb.dev.platform_data = npd;//把初始化的驱动相关信息放到dev的私有数据里面 // 供驱动使用,在驱动中我们将看到如何调用的 } } #endif
针对上面的s3cfb_set_platdata:
board文件中看到:是否确定参数,如下
是否需要添加取决于你的开关,我用的是普通屏,所以选择的是s3cfb_set_platdata(NULL) #ifdef CONFIG_FB_S5P #ifdef CONFIG_FB_S5P_LMS501KF03 spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); s3cfb_set_platdata(&lms501kf03_data); //set_data #else s3cfb_set_platdata(NULL);//set_data #endif
来看看时钟: s3cfb_get_clk_name(npd->clk_name);是获得设备时钟name,该函数在
setuo-fb-s5pc.c 中函数原型如下:
void s3cfb_get_clk_name(char *clk_name) { strcpy(clk_name, "sclk_fimd"); //可以看出所用的clk }
而下面是对设备操作的初始化(都在setuo-fb-s5pc.c ,指定相关硬件 的操作): npd->cfg_gpio = s3cfb_cfg_gpio; npd->backlight_on = s3cfb_backlight_on; npd->backlight_off = s3cfb_backlight_off; npd->lcd_on = s3cfb_lcd_on; npd->lcd_off = s3cfb_lcd_off; npd->clk_on = s3cfb_clk_on; npd->clk_off = s3cfb_clk_off; 在这里不做介绍,在驱动调用时,分析 -----总上,有了设备如何添加到内核中,board 文件中有这样一句: static struct platform_device *smdk4x12_devices[] __initdata = { 。。。。。。。。 #ifdef CONFIG_FB_S5P &s3c_device_fb 。。。。。。。。,
有此可以看出。此项可以根据内核配置 Device Drivers ---> Graphics support ---> <*> Support for frame buffer devices ---> <*> S5P Framebuffer support 好了设备device我们就分析完了。 总结了一下: 先定义了一个struct platform_device s3c_device_fb 结构体 然后指定了一下io和中断资源在static struct resource s3cfb_resource[] 中 之后定义了一个缺省配置 struct s3c_platform_fb default_fb_data ,而是否使用取决于 s3cfb_set_platdata(struct s3c_platform_fb *pd) 函数,该函数做了一下时钟 ,io,背光等操作集后,把这些操作都放在了s3c_device_fb.dev.platform_data = npd; 中供驱动匹配时调用 <接下来我们将要分析driver ,未完待续>
相关文章推荐
- itop4412 LCD设备驱动详解(四)之PROBE再深入
- itop4412 LCD设备驱动详解(二)之DRIVER
- itop4412 LCD设备驱动详解(三)之PROBE
- [迅为开发板资料分享]iTOP-4412开发板LCD的屏幕驱动
- linux平台设备驱动架构详解 Linux Platform Device and Driver
- 4412驱动实验之05 总线_设备_驱动注册流程详解
- linux平台设备驱动架构详解 Linux Platform Device and Driver
- iTOP-4412开发板驱动lcd显卡以及linux开机log的修改方法
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
- linux平台设备驱动架构详解 Linux Platform Device and Driver——神文,非常详细
- Itop4412开发板emmc驱动移植(设备树)
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
- linux平台设备驱动架构详解 Linux Platform Device and Driver
- linux下 s3c2440 lcd驱动移植详解
- linux 设备驱动开发详解 code (4)
- 转:linux下 s3c2440 lcd驱动移植详解
- linux 设备驱动开发详解 code (3)
- LINUX设备驱动之设备模型三--device&driver&bus(一)
- S3c2410 Linux下LCD驱动详解