实验四设备驱动移植Word下载.docx
《实验四设备驱动移植Word下载.docx》由会员分享,可在线阅读,更多相关《实验四设备驱动移植Word下载.docx(28页珍藏版)》请在冰点文库上搜索。
(3)设置NandFlash分区信息表
设置NandFlash的分区信息表是为内核启动以后加载文件系统用的,可以将NandFlash看成我们PC机的硬盘,对NandFlash的分区看成是对硬盘的分区,硬盘可以分成C盘,D盘之类,而NandFlash则可以分成很多块,每块有不同的名字、大小和用途。
下面是对Super-ARM实验箱的NandFlash进行分区的情况(参考表5-1-1):
Ø
第0块命名为"
uboot"
,它用来存放u-boot.bin映像,起始地址是NandFlash的0x000000,最大0x30000个字节;
第1块命名为"
kernel"
,用来存放内核,起始地址是NandFlash的0x30000,最大0x1D0000个字节;
第2块命名为"
rootfs"
,用来存放根文件系统,起始地址是NandFlash的0x200000,最大30M字节;
第3块命名为"
ext-fs1"
,留给用户存放其他文件系统,起始地址是NandFlash的0x2000000,最大32M字节;
至于具体要怎么分,这样根据你的目标机的NandFlash来定,不能一概而论。
分区的方法就是修改arch/arm/plat-s3c24xx目录下的common-smdk.c文件:
执行geditarch/arm/plat-s3c24xx/common-smdk.c命令,找到:
staticstructmtd_partitionsmdk_default_nand_part[],在其中填入下面的内容(将原来的内容覆盖)
[0]={
.name="
.size=0x30000,
.offset=0,
},
[1]={
.offset=0x30000,
.size=0x1D0000,
[2]={
.offset=SZ_2M,
.size=SZ_1M*30,
[3]={
.offset=SZ_32M,
.size=SZ_32M,
}
(4)进入内核顶层目录,修改arch/arm/mach-s3c2410/mach-smdk2410.c文件
第一处:
在其它头文件包含语句下面,添加下面的头文件
#include<
asm/arch-s3c2410/fb.h>
linux/fb.h>
asm/arch/regs-lcd.h>
asm/arch/regs-gpio.h>
asm-arm/arch-s3c2410/smdk2410.h>
第二处:
添加s3c2410fb_display结构
staticstructs3c2410fb_displaysmdk2410_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结构
staticstructs3c2410fb_mach_infosmdk2410_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驱动。
第五处:
在结构体smdk2410_iodesc[]__initdata中加入下面红色内容
staticstructmap_descsmdk2410_iodesc[]__initdata={
/*nothinghereyet*/
vSMDK2410_ETH_IO,
pSMDK2410_ETH_IO,
SZ_1M,
MT_DEVICE
(5)添加devfs文件系统支持
为了我们的内核支持devfs,以及在启动时能自动挂载/dev。
编辑fs/Kconfig:
在907行menu"
Pseudofilesystems"
下面添加如下代码:
configDEVFS_FS
bool"
/devfilesystemsupport(OBSOLETE)"
defaulty
configDEVFS_MOUNT
Automaticallymountatboot"
dependsonDEVFS_FS
(6)修改drivers/net/arm/Kconfig文件,让它支持CS8900网卡
geditdrivers/net/arm/Kconfig
在文件末尾添加下面这一段:
configARM_CS8900
tristate"
CS8900support"
dependsonNET_ETHERNET&
&
ARM&
ARCH_SMDK2410
help
supportforcs8900chipsetbasedEthernetcards,ifyouhaveanetworkcardofthistype
修改drivers/net/arm/Makefile
geditdrivers/net/arm/Makefile
在文件末尾添加一行:
obj-$(CONFIG_ARM_CS8900)+=cs8900.o
创建include/asm-arm/arch-s3c2410/smdk2410.h头文件
geditinclude/asm-arm/arch-s3c2410/smdk2410.h
在文件中添加如下内容:
#ifndef__ASM_ARCH_SMDK2410_H
#define__ASM_ARCH_SMDK2410_H
#definepSMDK2410_ETH_IO__phys_to_pfn(0x19000000)
#definevSMDK2410_ETH_IO0xE0000000
#defineSMDK2410_ETH_IRQIRQ_EINT9
#define__IRQT_FALEDGEIRQ_TYPE_EDGE_FALLING
#define__IRQT_RISEDGEIRQ_TYPE_EDGE_RISING
#define__IRQT_LOWLVLIRQ_TYPE_LEVEL_LOW
#define__IRQT_HIGHLVLIRQ_TYPE_LEVEL_HIGH
#defineIRQT_NOEDGE(0)
#defineIRQT_RISING(__IRQT_RISEDGE)
#defineIRQT_FALLING(__IRQT_FALEDGE)
#defineIRQT_BOTHEDGE(__IRQT_RISEDGE|__IRQT_FALEDGE)
#defineIRQT_LOW(__IRQT_LOWLVL)
#defineIRQT_HIGH(__IRQT_HIGHLVL)
#defineIRQT_PROBEIRQ_TYPE_PROBE
#endif
复制cs8900.h和cs8900.c两个文件到drivers/net/arm目录下
(7)配置内核
首先执行makes3c2410_defconfig命令获取s3c2410_defconfig文件中给定的配置。
然后执行makemenuconfig命令配置内核
makes3c2410_defconfig
makemenuconfig
将出现以下图形配置界面:
第一项:
选择设备CPU类型
在这个选单中,选择systemtype-->
s3c2410machines中的smdk2410,其它的arch-machines全部取消。
这个页面选择s3c2410Machines-->
这个页面把其它machines全部取消。
第二项:
添加S3C2410LCD驱动支持
进入Devicedrivers-->
Graghicssupport-->
Supportforframebufferdevices,出现下面的界面,选中S3C2410LCDframebuffersupport和S3C2410lcddebugmessages两个选项。
图13-4-1添加s3c2410LCD驱动
第三项:
Bootuplogo
配置Bootuplogo是为了在内核加载完LCD驱动后在LCD屏上看到一个小企鹅。
Bootuplogo,出现下面的界面,三个不同的logo选项对应不同的小企鹅图片,可以到内核的drivers/video/logo目录下找到对应的图片,读者可以根据自己的喜好随便选择一个。
第四项:
增加网卡支持
增加对cs8900的支持:
Devicedrivers---->
Networkdevicesupport--->
Ethernet(10or100Mbit)----->
<
*>
CS8900Support。
配置界面如下图所示:
第五项:
退出保存设置
退出时候记得选择yes进行保存
(8)配置文件系统
为arm系统制作根文件系统的详细过程描述如下。
1、首先建立一个空根目录
我们的项目空间中将根文件系统规划在rootfs目录下,这个目录现在是空的,就把它作为我们的空根目录,接下来我们就在这个目录下建立根文件系统。
2、在rootfs中建立文件系统的目录结构,所有命令如下:
mkdir-p/arm2410/rootfs
cd/arm2410/rootfs
mkdirbindevetclibprocsbinsysusrmnttmpvar
chmod0777tmp
mkdirusr/binusr/libusr/sbinlib/modules
mkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/temp
mkdirvar/libvar/lockvar/logvar/runvar/tmp
chmod0777var/tmp
第一行创建根文件系统目录。
第二行进入根文件系统目录。
第三行在根目录下创建一级目录bindevetclibprocsbinsysusrmnttmpvar。
第四行更改tmp权限,使得用户只能修改、删除自己在本目录下创建的文件。
第五行创建usr目录下的子目录
第六行创建mnt目录下的子目录。
第七行创建var目录下的子目录。
第八行更改var/tmp目录的权限。
3、创建设备文件
先了解一下Linux的设备:
Linux中主要有2种类型的设备:
字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。
每个设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。
这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"
虚拟设备"
)。
每个设备在/dev目录下都有一个对应的文件(节点)。
可以通过cat/proc/devices命令查看当前已经加载的设备驱动程序的主设备号。
你可以在你的宿主机上执行这个命令看看你的宿主机所拥有的设备文件,可以看到,Linux有很多很多的设备文件,在嵌入式Linux中并没有这么多的设备,下面用mknod命令创建一些主要设备文件。
关于Linux的设备号:
很多设备在Linux下已经有默认的主次设备号,如帧缓冲设备是Linux的标准字符设备,主设备号是29,如果Linux下有多个帧缓冲设备,那么这些帧缓冲设备的次设备号就从0~31(Linux最多支持32个帧缓冲设备)进行编号,比如fb0对应的次设备号就是0,fb1为1,类推。
用户也可以创建自己的设备文件,比如下一篇章中我们要讨论的Led设备,需要注意的是用户自己的设备号不能与一些标准的系统设备号重叠。
Linux下创建设备节点的命令是mknod,下面是它的命令格式:
mknodName{b|c}MajorMinor
Name是设备名称,“b”或“c”用来指定设备的类型是块设备还是字符设备。
Major指定设备的主设备号,Minor是次设备号。
下面我们来创建嵌入式Linux系统中一些基本的设备文件,必须是root权限,命令如下:
mknod-m600dev/consolec51#1
mknod-m666dev/nullc13#2
mknoddev/fb0c290#3
mknoddev/ttyc50#4
mknoddev/tty0c40#5
mknoddev/tty1c41
mknoddev/tty2c42
mknoddev/tty3c43
mknoddev/tty4c44
ln-sdev/fb0dev/fb#6
第一行创建系统控制台设备
第二行创建空设备,任何写入都将被丢弃,任何读取都得到EOF
第三行创建第一个帧缓冲设备
第四行创建TTY设备
第五行创建当前虚拟控制台
第六行创建创建fb到fb0的链接
4、准备启动配置文件
Linux启动所需要的文件有etc/inittab、etc/init.d/rcS、etc/fstab这三个文件(以下均假定当前路径在/arm2410/rootfs)。
下面创建inittab文件,命令:
geditetc/inittab,在文件中添加如下内容:
:
sysinit:
/etc/init.d/rcS
askfirst:
-/bin/sh
respawn:
restart:
/sbin/init
ctrlaltdel:
/sbin/reboot
shutdown:
/bin/umount-a-r
/sbin/swapoff-a
分析该配置文件,可以知道init进程首先执行/etc/init.d/rcS脚本文件,该文件马上就会被创建。
rcS
创建rcS文件,命令:
mkdiretc/init.d
geditetc/init.d/rcS
#!
/bin/sh
#mountallfilesystemdefinedin"
fstab"
echo"
#mountall......."
/bin/mount-a
更改该文件的权限:
chmod775etc/init.d/rcS
刚刚说到rcS文件是init进程执行的初始化命令脚本,在该文件中,笔者只加了一条命令:
“/bin/mount-a”,用来加载fstab文件中定义的文件系统,fstab文件马上就被会创建。
fstab
首先来看看/etc/fstab文件的作用,该文件存放的是系统中的文件系统信息。
当正确的设置了该文件,则可以通过"
mount/directoryname"
命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。
同时fsck、mount、umount的等命令都利用该程序。
fstab文件格式如下:
fs_specfs_filefs_typefs_optionsfs_dumpfs_pass
●fs_spec:
该字段定义希望加载的文件系统所在的设备或远程文件系统,对于NFS情况,格式一般为<
host>
<
dir>
例如:
`210.43.111.211:
/armnfs'
。
对于procfs,使用`proc'
来定义。
●fs_file:
该字段描述文件系统所希望加载的目录点,对于swap设备,该字段为none;
对于加载目录名包含空格的情况,用40来表示空格。
●fs_type:
定义了该设备上的文件系统类型。
●fs_options-指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。
对于大多数系统使用"
defaults"
就可以满足需要。
●fs_dump:
该选项被"
dump"
命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0。
●fs_pass:
该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"
/"
对应该字段的值应该为1,其他文件系统应该为2。
若该文件系统无需在启动时扫描则设置该字段为0。
下面创建fstab文件,命令:
geditetc/fstab,在该文件中添加如下内容:
proc/procprocdefaults00
none/tmpramfsdefaults00
sysfs/syssysfsdefaults00
(5)利用BusyBox安装命令工具
下载并解压BusyBox
下载busybox-1.9.2.tar.bz2(地址:
解压busybox-1.9.2.tar.bz2,并进入解压后的busybox-1.9.2目录
cd/arm2410/sysapp/
wgetftp:
//192.168.4.210/busybox