LCD移植
2013-03-18 21:00
204 查看
移植驱动就是根据也有的内核,加以改造,然后编译进内核,供系统调用
帧缓冲设备在linux系统中的实现流程
用户空间层定义一个file_operation结构,该结构里的函数供应用程序调用,但是该结构体里的函数都需要一个struct fb_info结构体(该结构体记录了驱动的所有信息),fb_info结构体由驱动结构体里面的探测函数来填充,探测函数又需要平台设备结构体 struct platform_device *pdev来传递数据(每个不同的平台设备的该结构不同,定义在Devs.c文件里)
dev传递的就是每个不同设备的私有数据。其中在传递数据的时候用到platform机制
移植过程
platform机制的开发设备驱动的流程:设备用platform_device表示,驱动用platform_drvier注册。
——>定义资源结构(struct resource)
——>填充资源结构
——>定义设备(struct platform_devic)
——>填充平台设备
**************************************************Devs.c (arch\arm\plat——s3c24xx)*****************************************************
*******************************************************定义资源结构并填充资源*************************************************************
static struct resource s3c_lcd_resource[] = {
[0] = {
.start = S3C24XX_PA_LCD,/*LCD寄存器的起始地址,由于arm的寄存器采用内存统一编址,使用的是内存资源*/
.end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,/*lcd寄存器的结束地址,结束地址了大于实际值*/
.flags = IORESOURCE_MEM,/*资源类型为内存资源*/
},
[1] = {
.start = IRQ_LCD,
.end = IRQ_LCD,
.flags = IORESOURCE_IRQ,
}
};
static u64 s3c_device_lcd_dmamask = 0xffffffffUL;
**************************************************Devs.c (arch\arm\plat——s3c24xx)*****************************************************
*******************************************************定义平台设备并填充平台设备********************************************************
struct platform_device s3c_device_lcd = {
.name = "s3c2410-lcd",/*平台设备的名称,后来平台驱动的名称必须与此相同*/
.id = -1,/*如果只有一个设备像内核注册,则该值为-1*/
.num_resources = ARRAY_SIZE(s3c_lcd_resource),/*设备使用的资源数*/
.resource = s3c_lcd_resource,/*设备资源的指针*/
.dev = {
.dma_mask= &s3c_device_lcd_dmamask,
.coherent_dma_mask= 0xffffffffUL
}
};
EXPORT_SYMBOL(s3c_device_lcd);
——>注册平台设备结构int platform_device_register(struct platform_device *pdev )
****************************************** arch/arm/mach—s3c2440smdk2440.c********************************************************
*******************************************************注册平台设备************************************************************************
static void __init s3c2440_machine_init(void)
{
#if defined (LCD_WIDTH)
s3c24xx_fb_set_platdata(&s3c2440_fb_info);
#endif
s3c_i2c0_set_platdata(NULL);
s3c2410_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND);
s3c_device_nand.dev.platform_data = &s3c_arm_nand_info;
s3c_device_sdi.dev.platform_data = &s3c2440_mmc_cfg;
platform_add_devices(s3c2440_devices, ARRAY_SIZE(s3c2440_devices)); /*该函数调用platform_device_register()进行注册*/
s3c_pm_init();
}
——>定义驱动struct platform_driver
**************************************************s3c2410fb.c*******************************************************************************************************************定义驱动结构体**********************************************************
static struct platform_driver s3c2410fb_driver = {
.probe= s3c2410fb_probe,
.remove= s3c2410fb_remove,
.suspend= s3c2410fb_suspend,
.resume= s3c2410fb_resume,
.driver= {
.name= "s3c2410-lcd",
.owner= THIS_MODULE,
},
};
——填充驱动结构(主要靠探测函数fb.c中的probe来填充)
——注册驱动int platform_driver_register(struct platfrom_driver *drv)
****************************************************s3c2410fb.c*******************************************************************************************************************注册驱动函数**********************************************************
int __init s3c2410fb_init(void)/*模块insmod执行后,程序就跑到这里,进行驱动的注册,
但驱动加载之前设备platform_device必须被注册*/驱动程序入口
{
int ret = platform_driver_register(&s3c2410fb_driver);/*注册2410到驱动*/
if (ret == 0)
ret = platform_driver_register(&s3c2412fb_driver);/*注册2412到驱动*/
return ret;
}
帧缓冲设备在linux系统中的实现流程
用户空间层定义一个file_operation结构,该结构里的函数供应用程序调用,但是该结构体里的函数都需要一个struct fb_info结构体(该结构体记录了驱动的所有信息),fb_info结构体由驱动结构体里面的探测函数来填充,探测函数又需要平台设备结构体 struct platform_device *pdev来传递数据(每个不同的平台设备的该结构不同,定义在Devs.c文件里)
dev传递的就是每个不同设备的私有数据。其中在传递数据的时候用到platform机制
移植过程
platform机制的开发设备驱动的流程:设备用platform_device表示,驱动用platform_drvier注册。
——>定义资源结构(struct resource)
——>填充资源结构
——>定义设备(struct platform_devic)
——>填充平台设备
**************************************************Devs.c (arch\arm\plat——s3c24xx)*****************************************************
*******************************************************定义资源结构并填充资源*************************************************************
static struct resource s3c_lcd_resource[] = {
[0] = {
.start = S3C24XX_PA_LCD,/*LCD寄存器的起始地址,由于arm的寄存器采用内存统一编址,使用的是内存资源*/
.end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,/*lcd寄存器的结束地址,结束地址了大于实际值*/
.flags = IORESOURCE_MEM,/*资源类型为内存资源*/
},
[1] = {
.start = IRQ_LCD,
.end = IRQ_LCD,
.flags = IORESOURCE_IRQ,
}
};
static u64 s3c_device_lcd_dmamask = 0xffffffffUL;
**************************************************Devs.c (arch\arm\plat——s3c24xx)*****************************************************
*******************************************************定义平台设备并填充平台设备********************************************************
struct platform_device s3c_device_lcd = {
.name = "s3c2410-lcd",/*平台设备的名称,后来平台驱动的名称必须与此相同*/
.id = -1,/*如果只有一个设备像内核注册,则该值为-1*/
.num_resources = ARRAY_SIZE(s3c_lcd_resource),/*设备使用的资源数*/
.resource = s3c_lcd_resource,/*设备资源的指针*/
.dev = {
.dma_mask= &s3c_device_lcd_dmamask,
.coherent_dma_mask= 0xffffffffUL
}
};
EXPORT_SYMBOL(s3c_device_lcd);
——>注册平台设备结构int platform_device_register(struct platform_device *pdev )
****************************************** arch/arm/mach—s3c2440smdk2440.c********************************************************
*******************************************************注册平台设备************************************************************************
static void __init s3c2440_machine_init(void)
{
#if defined (LCD_WIDTH)
s3c24xx_fb_set_platdata(&s3c2440_fb_info);
#endif
s3c_i2c0_set_platdata(NULL);
s3c2410_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND);
s3c_device_nand.dev.platform_data = &s3c_arm_nand_info;
s3c_device_sdi.dev.platform_data = &s3c2440_mmc_cfg;
platform_add_devices(s3c2440_devices, ARRAY_SIZE(s3c2440_devices)); /*该函数调用platform_device_register()进行注册*/
s3c_pm_init();
}
——>定义驱动struct platform_driver
**************************************************s3c2410fb.c*******************************************************************************************************************定义驱动结构体**********************************************************
static struct platform_driver s3c2410fb_driver = {
.probe= s3c2410fb_probe,
.remove= s3c2410fb_remove,
.suspend= s3c2410fb_suspend,
.resume= s3c2410fb_resume,
.driver= {
.name= "s3c2410-lcd",
.owner= THIS_MODULE,
},
};
——填充驱动结构(主要靠探测函数fb.c中的probe来填充)
——注册驱动int platform_driver_register(struct platfrom_driver *drv)
****************************************************s3c2410fb.c*******************************************************************************************************************注册驱动函数**********************************************************
int __init s3c2410fb_init(void)/*模块insmod执行后,程序就跑到这里,进行驱动的注册,
但驱动加载之前设备platform_device必须被注册*/驱动程序入口
{
int ret = platform_driver_register(&s3c2410fb_driver);/*注册2410到驱动*/
if (ret == 0)
ret = platform_driver_register(&s3c2412fb_driver);/*注册2412到驱动*/
return ret;
}
相关文章推荐
- LCD驱动移植在在mini2440(linux2.6.29)和FS4412(linux3.14.78)上实现对比(deep dive)
- ARM9开发板FL2440移植Linux-3.0内核————MMC和LCD驱动
- AM1808 LCD驱动移植
- SMDK2416 3.5"LCD驱动程序的移植
- 图形液晶240*128驱动(型号为SMG240128A)移植到jlx的128*64单色lcd架构
- 第十九章、TIny4412 U-BOOT移植十九 LCD移植
- fl2440的U-boot-2010.09移植(七)LCD的支持
- 移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动
- 针对up-tech 2410LCD和触摸屏、USB,NE2000移植!
- Linux-2.6.32.2内核在mini2440上的移植(七)---LCD驱动移植
- linux2.6.32.2 mini2440平台移植--LCD 背光驱动
- s5pv210 LCD驱动移植
- 基于S3C2440的Linux-3.6.6移植——LCD的应用
- 移植Linux2.6.24.7到博创2410S之:LCD(SHARP LQ080V3DG01)驱动移植
- WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(4)-LCD驱动
- 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
- 2440上的LCD驱动移植
- 移植驱动到内核学习笔记3-----LCD及输入系统
- linux 2.6.32 在arm9(s3c2440)平台的移植 - LCD背光驱动
- 基于ARM9处理器的linux-2.6.32.2操作系统内核移植手记part5.2(LCD驱动源码分析及移植之platform driver)