前言
实验环境:
开发板:JZ2440
虚拟机:ubuntu 18.04
Linux内核版本:4.19.5
交叉编译工具链:
本次移植主要分为分析和修改代码两个部分。LCD驱动是在MINI2440的基础上进行修改,所以在进入系统的时候要指定自己的machid为7CF,因为MINI2440的LCD框架已经做好了,所以代码的修改量比较少,只需要修改一些参数就可以,不想看分析过程的可以直接看修改代码部分。推荐还是可以看看分析过程,对Linux内核中的总线设备驱动程序能有进一步的了解。如果有表达不准确或者错误的地方欢迎大家指正。
分析过程
注:为了方便分析我对下列的源码做了删减。
因为我从U-BOOT传给内核的machid=7CF,是对MINI2440进行适配。所以从MINI2440的初始化函数开始看。
\arch\arm\mach-s3c24xx\mach-mini2440.c
static void __init mini2440_init(void)
{
struct mini2440_features_t features = {
0 };
int i;
printk(KERN_INFO "MINI2440: Option string mini2440=%s\n",
mini2440_features_str);
/*
解析"0tb"字符串,运行后结果为选择mini2440_lcd_cfg[0],作为LCD的配置,
创建一个背光设备mini2440_led_backlight和LCD设备s3c_device_lcd到features->optional待注册
*/
mini2440_parse_features(&features, mini2440_features_str);
/*
打开LCD电源
*/
s3c_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND);
/*
打开LCD背光灯
*/
WARN_ON(gpio_request_one(S3C2410_GPG(4), GPIOF_OUT_INIT_HIGH, NULL));
gpio_free(S3C2410_GPG(4));
/* 配置PB1为上拉输入 */
gpio_request_one(S3C2410_GPB(1), GPIOF_IN, NULL);
s3c_gpio_setpull(S3C2410_GPB(1), S3C_GPIO_PULL_UP);
gpio_free(S3C2410_GPB(1));
/* 打印LCD信息 */
/* MINI2440: LCD
[0:240x320]
1:800x480
2:1024x768
3:320x240
*/
if (features.lcd_index != -1) {
int li;
mini2440_fb_info.displays =
&mini2440_lcd_cfg[features.lcd_index];
printk(KERN_INFO "MINI2440: LCD");
for (li = 0; li < ARRAY_SIZE(mini2440_lcd_cfg); li++)
if (li == features.lcd_index)
printk(" [%d:%dx%d]", li,
mini2440_lcd_cfg[li].width,
mini2440_lcd_cfg[li].height);
else
printk(" %d:%dx%d", li,
mini2440_lcd_cfg[li].width,
mini2440_lcd_cfg[li].height);
printk("\n");
/* 设置LCD platform device设备的数据信息 */
s3c24xx_fb_set_platdata(&mini2440_fb_info);
}
if (features.count) /* the optional features */
/* 注册optional数组里面的设备,这里面就包括了我们的LCD设备和背光设备*/
platform_add_devices(features.optional, features.count);
}
这个函数中比较重要的就是s3c24xx_fb_set_platdata(&mini2440_fb_info),他设置了向LCD驱动程序传递硬件信息。就形成了以下对应关系。
- s3c_device_lcd->dev.platform_data=mini2440_fb_info
- mini2440_fb_info.displays=mini2440_lcd_cfg[0]
因为总线分为设备和驱动两部分,现在用函数platform_device_register注册完设备,紧接着就要看用函数platform_driver_register注册的驱动程序。
可以直接搜索和 s3c2412-lcd 。发现在\drivers\video\fbdev\s3c2410fb.c目录下注册了一个同名的驱动。