动态加载驱动和Linux内核移植Word格式.docx
- 文档编号:21202180
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:16
- 大小:90.13KB
动态加载驱动和Linux内核移植Word格式.docx
《动态加载驱动和Linux内核移植Word格式.docx》由会员分享,可在线阅读,更多相关《动态加载驱动和Linux内核移植Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
windows系统:
□WinXP□Xin7其他:
Linux系统:
□RedHat9□RHEL4其他:
VMWare虚拟机:
□VMWareWorkstation9其他:
串口调试工具:
□WinXP自带的超级终端
□Linux自带的minicom
□第三方串口工具:
嵌入式Linux
3.项目预习
(1)了解项目目标、项目任务要求、项目设计和项目实施步骤。
(2)下载本次实验所需要的软件和代码。
将3_kbd_test目录放到linux虚拟机的up-techpxa270cl目录下。
(3)完成内核裁剪及编译好内核映像,即完成第5大项中的步骤(4)-(5)。
(4)回答以下问题
如何能够在目标机上访问宿主机上的文件?
说明使用mount命令进行文件挂载的方法。
说明mount命令执行不成功可能的原因和解决方法。
说明本实验所使用的Linux内核版本。
说明Linux内核裁减定制的方法。
4.项目设计
4.1选择Linux内核裁减方法
Linux内核的裁减配置的三种命令:
1、makeconfig:
命令行模式,一行一行的配置,不推荐使用。
2、makemenuconfig:
大多人熟悉的menuconfig菜单。
3、makexconfig:
基于QT图形化配置,菜单结构清晰。
所有内核裁减配置过程,都是通过Config.in(2.4内核)或Kconfig(2.6内核)经由不同脚本解释器产生.config配置文件。
makemenuconfig配置菜单
makexconfig配置菜单
在配置时,通常有三种选择方式:
●Y:
将该功能编译进内核;
●N:
不将该功能编译进内核;
●M:
以模块方式编译,需要时可以动态插入到内核中。
在makemenuconfig界面中,用空格键来切换各种选择状态;
在makexconfig界面中,可以用空格键,也可以使用鼠标来选择。
注意:
对于陌生选项,请不要修改,保留默认即可。
5.项目实施
=======================================
实验室实验部分
(1)将3_kbd_test目录放到linux虚拟机的up-techpxa270cl目录下。
3_kbd_test目录中的内容如下:
其中:
●getkey为交叉编译生成的可执行程序,用于测试键盘设备;
●mega8.ko为键盘等控制芯片的驱动程序,i2c-pxa.ko为i2c接口驱动;
●install_driver.sh为动态加载mega.ko和i2c-pxa.ko的脚本;
●zImage为裁剪、编译后的内核。
(2)查看ARM目标机自带内核对键盘的支持情况(通过超级终端)
查看键盘设备节点/dev/Mega8Kbd是否已经存在?
Nosuchfileordirectory表示不存在。
[root@Intel/]#ls/dev/Mega8Kbd
ls:
/dev/Mega8Kbd:
Nosuchfileordirectory
查看键盘驱动是否以模块形式动态加载?
以下结果表示没有动态加载。
[root@Intel/]#lsmod
ModuleSizeUsedbyNottainted
[root@Intel/]#
查看当前系统设备中是否有Mega8Kbd设备?
[root@Intel/]#cat/proc/devices
Characterdevices:
1mem
2pty
3ttyp
4/dev/vc/0
4tty
4ttyS
5/dev/tty
5/dev/console
5/dev/ptmx
7vcs
10misc
13input
14sound
21sg
29fb
81video4linux
89i2c
90mtd
108ppp
128ptm
136pts
161ircomm
180usb
254pcmcia
使用mount命令挂载,运行键盘测试程序getkey。
查看getkey是否可以运行?
Can'
topenkeyboard!
表示不能打开键盘设备。
为防止大文件传输失败,在mount中加入参数–ointr,nolock,rsize=4096,wsize=4096
[root@Intel/]#ifconfigeth0192.168.0.10(些处为了后面烧写内核方便,虚拟机为服务器)
[root@Intel/]#servicenfsrestart
[root@Intel/]#mount–tnfs–ointr,nolock,rsize=4096,wsize=4096192.168.0.10:
/up-techpxa270cl/mnt/nfs
[root@Intel/]#cd/mnt/nfs/3_kbd_test
[root@Intel3_kbd_test]#./getkey
KBD_Open-Can'
KBDKEY:
Badfiledescriptor
(3)在自带内核的基础上,动态加载键盘驱动,并测试
使用install_driver.sh脚本加载驱动程序:
[root@Intel3_kbd_test]#./install_driver.sh
i2c_pxa:
modulelicense'
unspecified'
taintskernel.
I2C:
Slaveaddress1
Enablingslavemode
i2c-0:
PXAI2Cadapter
noPS/2devicefoundonPS/2Port0!
noPS/2devicefoundonPS/2Port1!
[root@Intel3_kbd_test]#
注:
如果install_driver.sh不能运行,分析原因,若是权限问题可执行命令chmod777将该目录下的文件执行权限放开,并再次执行install命令。
也可以不执行install命令而是直接输入以下两条命令(install_driver.sh文件中的内容)。
insmodi2c-pxa.ko
insmodmega8.ko
如果提示已经存在,可以使用rmmodi2c-pxa.ko和rmmodmega8.ko卸载,然后重新加载。
再次查看键盘设备节点是否已经存在?
看到/dev/Mega8Kbd表明已经存在。
[root@Intel3_kbd_test]#ls/dev/Mega8Kbd
/dev/Mega8Kbd
如果看不到设备结点,创建设备结点的命令是
mkmod设备名设备类型主设备号从设备号
如:
mkmod/dev/Mega8kbdc2530
再次查看键盘驱动是否以模块形式动态加载?
结果表明动态加载了驱动。
[root@Intel3_kbd_test]#lsmod
ModuleSizeUsedbyTainted:
P
mega8172440
i2c_pxa67241mega8
[root@Intelkbd_test]#
再次查看当前系统设备情况,结果表明有Mega8Kbd键盘设备。
[root@Intel3_kbd_test]#cat/proc/devices
252Mega8ICcard
253Mega8Kbd
再次运行键盘测试程序:
按ARM目标机上的小键盘,可以正确读取到按键值。
whichkeyyoupressis1
whichkeyyoupressis2
whichkeyyoupressis3
课堂实验部分
(4)检查修改内核源代码目录下的Makefile文件。
命令:
[root@vm-dev]#cd/up-techpxa270cl/kernel/linux-2.6.9-uptechpxa270cl
打开Makefile文件,找到以下几行:
如果不是下面的结果,则按下面内容修改。
ARCH:
=arm表示编译支持ARM体系结构
CROSS_COMPILE=您的交叉编译工具中arm-Linux所在目录/arm-Linux-
例如:
CROSS_COMPILE=/up-techpxa270/arm-linux-tools/gcc-
(5)裁剪新内核
在内核源代码目录(up-techpxa270cl/kernel/linux-,拷贝一个已有的默认配置文件更名为.config(如果询问是否覆盖,输入y),然后在默认配置基础上,使用makemenuconfig对内核进行裁减。
[root@vm-dev]#cpup-techpxa270-cl-2008-05-26.config.config
[root@vm-dev]#makemenuconfig
如果出现“atleast80columns”,说明屏幕不够大,全屏即可。
思考:
.config配置文件作用?
按照以下步骤和提示,选中目标机所需的模块支持(使用“上下箭头”移动,使用“Enter”进入,使用“Esc”返回上级)。
1、选择处理器类型(默认已经选上)
SystemType--->
ARMsystemtype(PXA2xx-based)--->
(X)PXA2xx-based
2、网卡设备(默认已经选上)
Networkingsupport--->
[*]Networkdevicesupport
Ethernet(10or100Mbit)--->
[*]Ethernet(10or100Mbit)
<
*>
DM9000support
3、矩阵键盘设备(使用空格键切换选择,选中Atmel项,按下空格键,可以在*,M和空之间变换,*表示编译到内核,M表示动态模块方式加载,空表示不支持)
I2Csupport--->
I2Csupport
I2CHardwareBussupport--->
IntelPXA2XXI2Cadapter
OtherI2CChipsupport--->
AtmelMega8MCUonUPTechPXA270-classicplatform
[*]MatrixKeyboard
4、USB鼠标支持
Inputdevicesupport--->
<
Mouseinterface
USBsupport--->
(位置在下方,默认已经选上)
USBHumanInterfaceDevice(fullHID)support
[*]HIDinputlayersupport
[*]/dev/hiddevrawHIDdevicesupport
5、声卡支持(默认已经选上)
Sound--->
Soundcardsupport
OpenSoundSystem--->
PXAAudio
PXAAC97audiosupport
UCB1X00coresupport
UCB1X00touchscreenplugin
退出并保存配置信息。
上面配置选项应该在哪个目录下的哪个文件里(KConfig)?
通过makemenuconfig裁剪完后,.config文件会有哪些变化?
若内核中没有你想要的功能模块选项将怎么办(拷贝驱动程序,修改KConfig等)?
(6)编译新内核
在内核目录下(up-techpxa270cl/kernel/linux-,执行make命令,进行内核的编译。
[root@vm-dev]#make
编译成功后,会在/up-techpxa270cl/kernel/linux-
[root@vm-dev]#cd/up-techpxa270cl/kernel/linux-
[root@vm-dev]#ls
(7)烧写新内核
0)将已经生成的zImage拷贝到/tftpboot目录下(如果询问是否覆盖,输入y)。
[root@vm-dev]#cp–rfzImage/tftpboot
1)配置tftp服务
首先请确保Linux虚拟机的tftp服务已经正确配置,并运行。
①在虚拟机上用vi打开“/etc/xinetd.d/tftp”,做相应的修改。
(大部分网络服务都是由它启动的)
[root@vm-dev]#vi/etc/xinetd.d/tftp
②找到disable=no这一项,看看是不是此状态(默认是),若不是,则改成此状态,保存退出。
③重启tftp服务,命令如下:
[root@vm-dev]#servicexinetdrestart
④查看tftp服务是否启动:
[root@vm-dev]#servicexinetdstatus
2)烧写新内核
给目标机加电后,进入blob模式下(按回车之外的任意键),首先配置tftp服务器的IP。
blob>
ifconfigserver(因为虚拟机IP前面已经配置为,所以此步可不做)
注意:
tftpserver的IP是Linux虚拟机的IP。
重启ARM目标机后可能需要重新配置tftpserver的IP。
如果在blob下修改IP失败或者超时等,可以将Linux虚拟机的IP修改为IP是
然后将内核zImage烧写到Ram。
tdownloadkernel
出现下面状态表示正确:
file:
zImage,partkernel
downloadingzImageto0xa0200000
done
如果出现ARPtimeout错误,可能是网络原因,可以尝试将windows网卡禁用并启用,改IP,检查网线等。
再将内核zImage烧写到Flash。
flashkernel
Savingkerneltoflash
fwrite0xa02000000x1000001597152
Erasing13blocksat0x00100000:
.............done
Flashing0x00185ee0bytesat0x00100000:
(8)测试新内核
重启ARM目标机,按回车键,看是否能正常进入Linux系统。
无需手动加载驱动,直接通过:
ls/dev/Mega8Kbd命令查看键盘设备节点,
会显示:
通过cat/proc/devices查看设备信息,以及运行键盘测试程序getkey。
看看是否键盘驱动已经直接加入了内核,并且已经自动创建好设备节点,键盘测试程序能够正确获得按键信息。
[root@Intelkbd_test]#cat/proc/devices
(9)还原系统自带内核
将3_kbd_test目录下的zImage拷贝到/tftpboot/目录下。
重新执行(7),并重启ARM目标机,按回车键,看是否能正常进入Linux系统。
6.项目运行
运行结果要求:
1、正确启动ARM目标机的系统
2、键盘测试程序正确读取键值信息
7.项目问题
1、说明本次实验中的硬件系统。
2、嵌入式Linux内核的代码构成?
设备驱动程序放在什么目录下?
3、说明动态加载模块的命令,卸载模块的命令,创建设备节点的命令。
4、说明内核裁剪定制的方法。
5、在配置内核时,通常有三种选择方式:
试问,选择M和不进行内核配置、编译直接使用insmod动态加载模块(第5大项步骤3)有何不同?
6、如何对内核kernel进行裁减定制,例如增加一个模块?
7、配置文件主要有哪些?
8、.config文件作用?
内核中有几个.config文件?
9、Kconfig文件作用?
内核中有几个Kconfig文件?
10、Makefile文件作用?
内核中有几个Makefile文件?
11、说明Makefile文件与.config的关系?
12、如何编译内核kernel?
13、内核kernel如何烧写到目标机中?
8.项目考核
考核项目
权重
主要考核点
实验预习(个人)
20%
实验要求的预习项
实验过程及结果(个人)
40%
动手执行能力
解决问题的能力
项目完成程度
实验总结(个人)
实验报告检查
提问
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 加载 驱动 Linux 内核 移植