uClinux下驱动开发入门精华――修改后的《详解第二版》的驱动
附件中leddrv.c是驱动源程序,writeled.c 是应用程序
板子:4510b 2M flsah 16Msdram gpio4~7接发光二极管
一、nfs的建立,风之子有详细的过程,我的过程稍有不同,总结如下:
主机:(NFS服务器及其设置)
查看/etc/rc.d/init.d 目录下有没有nfs ,有则说明主机已安装nfs服务,继续向下做,
(1)修改配置文件etc/exports,加一行
/nfs/rootfs172.22.3.130(rw,sync,no_root_squash)
/nfs/rootfs为创建的根文件系统在主机上的目录,172.22.3.130是目标机的IP,rw表示允许下位机读写该目录,no_root_squash允许下位机以主机root用户身份挂载根文件系统,sync表示资料同步写入存储器中
(2)配置其为所有用户可读,chmod 644 /etc/exports
(3)用exportfs命令使改动立即生效,在/etc目录下执行 exportfs-rv 此命令要求全部重新输出一次,修改了exports文件后应执行此命令一次,
(4)启动NFS服务输入/etc/rc.d/init.d/nfsstart
(5)用/usr/sbin/rpcinfo Cp检查是否启动了正常NFS服务器,若启动了则至少应该看到nfs, mountd 和 portmapper
(6)在linux终端下运行setup,进入system services去掉下面的服务
[ ]ip6tables [ ]ipchains[ ]iptables[ ]dhcpd
目标板:
(1)内核需要支持NFS
make menuconfig 选中[*]customize kernel settings
[*]customize vendor/user settings 退出保存
进入linux kernel v2.4.20-uc0 configuration 界面
File Systems -->
Network File Systems -->
[*] NFS file system support
[*]Provide NFSv3 client support退出保存
进入uClinux-v1.3.4 configuration界面
Network Application--------------->
[*]portmap 退出
busybox-------------------->
[*]mount
[*]mount :support NFS mounts
配置完后,重新编译内核 烧写flash
(2)目标板启动后,要能ping通主机
根目录下:/>portmap 后台运行
/> mount Ct nfs 172.22.3.131:/nfs/rootfs /var/tmp
等到/>出现,说明mount 成功了,若主机/nfs/rootfs下有文件,目标板/var/tmp中应能看到
172.22.3.131为主机IP,/nfs/rootfs为主机服务器开放给目标板的目录
二、配置内核为可动态加载模式的
make menuconfig 选中[*]customize kernel settings
[*]customize vendor/user settings 退出保存
进入linux kernel v2.4.20-uc0 configuration 界面
Loadable module support --->
[*] Enable loadable module support
[] Set version information on all module symbols (NEW)
[*] Kernel module loader (NEW) 退出保存
进入uClinux-v1.3.4 configuration界面
busybox---------------->
[*]insmod
[*]rmmod
[*]lsmod
----------other feathers
[*] Post 2.1 kernel modules
[*]model version checks 退出保存
重新编译内核 即可
leddrv.c编译方式:
arm-elf-gcc -D__KERNEL__ -I你的uClinux目录/linux-2.4.x/include-Wall -Wstrict-prototypes -Wno-trigraphs -O2-fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -mshort-load-bytes -msoft-float -DMODULE -c -o leddrv.o leddrv.c
writeled.c编译方式;arm-elf-gcc -Wall -O2 -Wl,-elf2flt -o writeled writeled.c
编译完后将leddrv.o和writeled拷贝到主机/nfs/rootfs下 就可调试了
由于uClinux是用romfs,所以/dev目录是只读,所以设备节点必须在制作romfs时制作进去,修改vendors/Samsung/4510B/Makefile
在DEVICES = \
最后加上leddrv,c,254,0 重新编译内核,在目标板上/dev下应该出现leddrv设备了
目标板上nfs连接成功后就可用/var/tmp>insmod leddrv.o和/var/tmp>./writeled看到驱动的效果了