LCD移植

移植驱动就是根据也有的内核,加以改造,然后编译进内核,供系统调用


帧缓冲设备在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值