实验四、设备驱动移植
- 格式:doc
- 大小:945.01 KB
- 文档页数:18
实验内容三—设备驱动移植
一、实验目的
(1)了解LCD显示原理及其与S3C2410的接口
(2)了解S3C2410的LCD控制器
(3)掌握基于帧缓冲设备的LCD驱动程序结构及移植过程
二、实验内容
在上次实验的基础上,通过修改内核显示相关文件,达到驱动LCD显示屏的目的。
三、实验步骤
(1)实验准备
从网上下载Linux的最新版本,解压后可以看到它的全部源代码,我们这里以linux-2.6.24为例,实现Linux的内核移植。
mkdir -p /arm2410/kernel
cd /arm2410/kernel
wget ftp://192.168.4.210/crosstool/linux-2.6.24.tar.bz2
tar -xvjf linux-2.6.24.tar.bz2
cd linux-2.6.24
(2)修改顶层Makefile
在顶层Makefile中先要定义交叉编译器,这里就使用我们第一次实验中构建的交叉编译器。查找ARCH,在193行左右修改确认ARCH和CROSS_COMPILE的值
ARCH ?=arm
CROSS_COMPILE ?=
arm-linux-
如果学生机上没有交叉编译环境,先从教师机上下载交叉编译环境
wget
ftp://192.168.4.210/u-boot/arm-linux-gcc.tar.bz2
tar -xjvf arm-linux-gcc.tar.bz2 -C
/
为了方便使用arm-linux-gcc,我们可以把它所在的目录添加到环境变量中
gedit /etc/profile
在export PATH前面加上
PATH=/arm2410/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/bin/:$PATH
这样一句,以后启动就可以直接使用arm-linux-gcc了。
要使环境变量立马生效,可以使用下面的命令。
source /etc/profile
(3)设置Nand Flash分区信息表
设置Nand Flash的分区信息表是为内核启动以后加载文件系统用的,可以将Nand
Flash看成我们PC机的硬盘,对Nand Flash的分区看成是对硬盘的分区,硬盘可以分成C盘,D盘之类,而Nand Flash则可以分成很多块,每块有不同的名字、大小和用途。下面是对Super-ARM实验箱的Nand Flash进行分区的情况(参考表5-1-1):
➢ 第0块命名为"uboot",它用来存放u-boot.bin映像,起始地址是Nand Flash的0x000000,最大0x30000个字节;
➢ 第1块命名为"kernel",用来存放内核,起始地址是Nand Flash的0x30000,最大0x1D0000个字节; ➢ 第2块命名为"rootfs",用来存放根文件系统,起始地址是Nand Flash的0x200000,最大30M字节;
➢ 第3块命名为"ext-fs1",留给用户存放其他文件系统,起始地址是Nand Flash的0x2000000,最大32M字节;
至于具体要怎么分,这样根据你的目标机的Nand Flash来定,不能一概而论。分区的方法就是修改arch/arm/plat-s3c24xx目录下的common-smdk.c文件:
执行gedit arch/arm/plat-s3c24xx/common-smdk.c命令,找到:static struct mtd_partition
smdk_default_nand_part[],在其中填入下面的内容(将原来的内容覆盖)
[0] = {
.name = "uboot",
.size = 0x30000,
.offset = 0,
},
[1] = {
.name
= "kernel",
.offset = 0x30000,
.size = 0x1D0000,
},
[2] = {
.name = "rootfs",
.offset = SZ_2M,
.size = SZ_1M*30,
},
[3] = {
.name = "ext-fs1",
.offset = SZ_32M,
.size = SZ_32M,
}
(4)进入内核顶层目录,修改arch/arm/mach-s3c2410/mach-smdk2410.c文件
➢ 第一处:添加下面的头文件
#include
#include
#include
#include
➢ 第二处:添加s3c2410fb_display 结构
static struct s3c2410fb_display smdk2410_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 240,
.height = 320,
.pixclock = 98619, // 10.14MHZ
.xres = 240,
.yres = 320,
.bpp = 16,
.left_margin =16,
.right_margin = 7,
.hsync_len = 14,
.upper_margin = 2,
.lower_margin = 3,
.vsync_len = 2,
};
上面这些参数的值都来自表13-1-4,计算方法如下:
xres = LINEVAL + 1
yres = HOZVAL + 1
pixclock = (1/hclk) ×1012 其中Super-ARM的hclk是10.14Mhz
left_margin = HFPD + 1
right_margin = HBPD + 1
hsync_len = HSPW+1
upper_margin = VBPD +1
lower_margin = VFPD+1
vsync_len = VSPW+1
➢ 第三处:添加s3c2410fb_mach_info 结构
static struct s3c2410fb_mach_info smdk2410_fb_info __initdata = {
.displays = &smdk2410_lcd_cfg,
.num_displays = 1,
.default_display = 0,
.gpccon = 0xaaa556a9,
.gpccon_mask = 0xfff003fc,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa95aaa5,
.gpdcon_mask = 0xffc0fff0,
.gpdup = 0x0000ffff,
.gpdup_mask = 0xffffffff,
.lpcsel = 0x4, };
关于gpccon,gpcup,gpdcon,gpdup的设置参考表13-2-13,gpccon_mask,gpcup_mask,gpdcon_mask,gpdup_mask的设置也很简单,如果某个端口配置成LCD功能,就把该端口对应的位都设置成1,其它没用的就设为0。
➢ 第四处:在函数smdk2410_init()中加入下面一行
s3c24xx_fb_set_platdata(&smdk2410_fb_info);
我跟大家分析一下添加这些代码的具体作用。首先看smdk2410_fb_info(第三处),它是s3c2410fb_mach_info类型的结构体,这个结构体有一个displays的成员变量,它指向s3c2410fb_display类型的指针。之前说过,一个系统有多少个显示设备就对应多少个s3c2410fb_display的结构,Super-ARM只有一个LCD显示设备,所以就只定义了一个s3c2410fb_display结构体smdk2410_lcd_cfg(第二处),那么displays就指向这个结构体,同时将num_displays赋值1。最后通过s3c24xx_fb_set_platdata函数将smdk2410_fb_info传递给底层LCD驱动。
(5)添加devfs文件系统支持
为了我们的内核支持devfs,以及在启动时能自动挂载/dev。编辑fs/Kconfig:在907行menu "Pseudo filesystems"下面添加如下代码:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
(5)配置内核
首先执行make s3c2410_defconfig命令获取s3c2410_defconfig文件中给定的配置。然后执行make menuconfig命令配置内核
make s3c2410_defconfig
make menuconfig
将出现以下图形配置界面: