您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: