JZ2440移植Linux内核4.19.5自带LCD驱动

本文介绍了如何在JZ2440开发板上移植Linux 4.19.5内核的LCD驱动,主要涉及分析现有MINI2440的LCD框架,理解设备与驱动的匹配过程,以及如何修改设备平台数据以适应JZ2440。通过修改`mach-mini2440.c`和`s3c2410fb.c`中的相关参数,并配置内核选项,实现了LCD驱动的移植,使得开发板启动时能在LCD上显示图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

实验环境:

开发板: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目录下注册了一个同名的驱动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值