1、static int hello_init(void)printk(KERN_ALERT #Hello, world#nreturn 0;/驱动程序出口函数static void hello_exit(void)#Goodbye, world#nmodule_init(hello_init);module_exit(hello_exit);有关驱动程序的编写规,请参考课程教材,本实验只在编写简单的驱动(核)程序并加入到 Linux核目录树中,使用户熟悉编译核的过程。该驱动程序是向终端输出相关程序信息。编写好 helloworld.c 后将其拷贝到核源码树的 drivers/char/目录下。r
2、ootlocalhost /# cp helloworld.c /UP-Magic210/SRC/kernel/linux-2.6.35.7/drivers/char/(2)、进入实验核源码目录修改 driver/char/目录下的 Kconfig 文件,按照 Kconfig 语法添加 helloworld 程序的菜单支持rootlocalhost /# cd UP-Magic210/SRC/kernel/linux-2.6.35.7/rootlocalhost linux-2.6.35.7# vi drivers/char/Kconfig例如:在 Kconfig 文件中的 source“dr
3、iver/char/hw_random/Kconfig”下面添加如下:source“driver/char/hw_random/Kconfig”config HELLO_MODULEbool Hello World Testdepends on CPU_S5PV210helpThis is a demo to test kernel experiment On UP-Magic210. (3)、进入实验核源码目录修改 driver/char/目录下的 Makefile 文件,按照核中 Makefile 语法添加 helloworld程序的编译支持rootlocalhost linux-2.6.
4、35.7# vi drivers/char/Makefile在 Makefile 中(大约在 91 行)添加如下一行obj-$(CONFIG_TOSHIBA) += toshiba.oobj-$(CONFIG_I8K) += i8k.oobj-$(CONFIG_DS1620) += ds1620.oobj-$(CONFIG_HW_RANDOM) += hw_random/obj-$(CONFIG_HELLO_MODULE) += helloworld.oobj-$(CONFIG_PPDEV) += ppdev.o(4)、运行 make menuconfig 配置核对 helloworld 程序
5、的支持: rootlocalhost linux-2.6.35.7# make distcleanrootlocalhost linux-2.6.35.7# make menuconfig先加载核配置单,如图:然后进入到 Device Drivers -菜单中如图:进入到 Character devices-如图:进入该菜单会发现 Hello World Test 选项,按下空格将其静态编译进核退出保存核配置(5)、重新编译核在核源码的顶层目录下编译核rootlocalhost linux-2.6.35.7# makescripts/kconfig/conf -s arch/arm/Kconf
6、igCHK include/linux/version.hCHK include/generated/utsrelease.hmake1:“include/generated/mach-types.h”是最新的。CALL scripts/checksyscalls.shCHK include/generated/compile.hCC drivers/char/helloworld.oLD drivers/char/built-in.oLD drivers/built-in.oLD vmlinux.oMODPOST vmlinux.o初次编译核源码,由核代码庞大,所需较长时间(大约几分钟至 1
7、0 几分钟不等)。编译成功后会在核源码目录的 arch/arm/boot/目录下生成核压缩文件 zImage。rootlocalhost linux-2.6.35.7# ls arch/arm/boot/zImagearch/arm/boot/zImagerootlocalhost linux-2.6.35.7#(6)、将新生成的核镜像文件 zImage 烧写到 UP-Magic210 型设备中,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.pdf”第23页)。新核烧写成功后启动 UP-Magic210 型系统,可以在串口终端中查看到 Lin
8、ux 核在启动过程中打印出来的如下信息:S3C_LCD clock got enabled : 133.000 MhzWindow0- FB1 : map_video_memory: clear ff600000:00096000FB1 : dma=57100000 cpu=ff600000 size=00096000Console: switching to colour frame buffer device 80x30fb-1069494052: frame buffer devicelp: driver loaded but no devices found#Hello, world#
9、ppdev: user-space parallel port drivers3c-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 37) is a S3Cs3c-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 38) is a S3Cs3c-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 39) is a S3CRAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksizeloop: loaded (max 8
10、 devices)nbd: registered device at major 43dm9000 Ethernet Drivereth0: dm9000 at c7866000,c7866002 IRQ 78 MAC: 00:22:12:34:56:90S3C IrDA driver, (c) 2006 Samsung ElectronicsLinux video capture interface: v2.00可以看到在终端上打印出#Hello, world#信息。同样进入 ARM 系统后也可以通过 dmesg 命令查看核启动信息。rootUP-TECH yaffs# dmesg4.实验结
11、果思考:如何能在Linux系统启动时,输出显示自定义的文本信息,请修改Linux核启动代码,完成此功能。5. 实验中遇到的问题及解决方法在实验中遇到一些问题,例如在复制的时候我记得原来用cpa/tmp/linux-2.4.18-br.tar.gz就可以了,可这次不行必须要用cp./到自己的目录下。不过最后都顺利解决了问题,在编译复习了make menuconfig的编译配置。实验二 根文件系统实验 了解 UP-Magic210 魔法师实验套件 Linux 系统下根文件系统结构 掌握根文件系统的搭建过程 掌握 busybox、mkcramfs 等工具的使用方法 使用 busybox 生成文件系统
12、中的命令部分,使用 mkcramfs 工具制作 CRAMFS 格式的根文件系统。 分析根文件系统 etc 目录下重要配置文件的格式及语法,熟悉根文件系统的启动过程3实验步骤/UP-Magic210/SRC/rootfs/一、在核中添加文件系统类型支持(1)、进入宿主机中 UP-Magic210 型光盘核目录:rootlocalhost # cd /UP-Magic210/SRC/kernel/linux-2.6.35.7/(2)、运行 make menuconfig 命令配置核文件系统相关支持添加对 CRAMFS 根文件以及 YAFFS2 文件系统系统支持进入 File systems -菜单
13、进入 Miscellaneous filesystems -选择 Compressed ROM file system support (cramfs) 支持,如图: YAFFS2 file system support 支持,配置如下图 退出保存核配置 运行make编译核,重新烧写核。二、根文件系统的实现(1)、制作 BUSYBOX 工具集进入本次实验目录rootlocalhost rootfs# cd /UP-Magic210/SRC/rootfs/rootlocalhost rootfs# lsbash-4.0.tar.bz2 busybox-1.19.3.tar.bz2 rootfs解
14、压 busybox-1.19.3.tar.bz2 压缩包rootlocalhost rootfs# tar xjvf busybox-1.19.3.tar.bz2产生 busybox-1.19.3 目录bash-4.0.tar.bz2 busybox-1.19.3 busybox-1.19.3.tar.bz2 rootfs进入 busybox-1.19.3 目录进行 busybox 的修改及配置修改此目录的 Makefile 文件,更改 ARCH ?和 CROSS_COMPILE ?=宏定义,如下:CROSS_COMPILE ?= arm-none-linux-gnueabi-ARCH ?=
15、arm退出保存。运行 make menuconfig 对工具集进行定制rootlocalhost busybox-1.19.3# make menuconfig进入 Busybox Settings -选项进入 Busybox Library Tuning -选中*Fancy shell prompts 支持进入 Miscellaneous Utilities -去除 inotifyd 选项接下来的配置可以根据具体情况来设置或裁剪相关工具。退出保存设置。编译 busyboxrootlocalhost busybox-1.19.3# make安装 busyboxrootlocalhost bus
16、ybox-1.19.3# make install成功后会在当前目录下生成 _install 目录,编译的工具也都集成在该安装目录下。rootlocalhost busybox-1.19.3# cd _install/rootlocalhost _install# lsbin linuxrc sbin usrrootlocalhost _install#可以看到_install 目录下生成了根文件系统常用的命令及工具,接下来的工作,用户可以根据需要将_install目录下生成的命令拷贝到根文件系统相应目录下。将从 busybox 生成的 which 命令拷贝到根文件系统目录的 usr/bin
17、目录下,这样,我们的根文件系统就支持 which 命令了。(2)、制作 CRAMFS 根文件系统镜像实验中已经提供了 mkcramfs 制作工具以及 mkrootfs.sh 脚本文件,用户只需执行 mkrootfs.sh 脚本文件来使用mkcramfs 制作根文件系统镜像即可。当然也可以手动的执行命令:./mkcramfs rootfs_up210 rootfs_up210.cramfsrootlocalhost rootfs# ./mkrootfs.sh此时在当前目录下生成根文件系统镜像文件 rootfs_up210.cramfsmkcramfs mkrootfs.sh rootfs_up2
18、10 rootfs_up210.cramfs三、烧写根文件系统将新生成的根文件系统镜像文件rootfs_up210.cramfs烧写到UP-Magic210 型设备中进行测试,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.pdf”第24页)。如果用户新添加了相关命令或工具(例如 which 命令)启动系统后可以验证用户添加入的新命令或工具。make 编译有错误,进行源代码的修改。之后再make menuconfig中将这个宏对应的东西配置成没有就好了,如果没有这个宏,那么就直接用出错的那个文件的名字找就行了,找到后给它去掉,将来make的时候
19、就不会编译这个文件了,在次进行make 编译后,编译出来了busybox这个东西,就在证明编译通过了。实验三 模块方式驱动实验 学习在 LINUX 下进行驱动设计的原理 掌握使用模块方式进行驱动开发调试的过程 在 PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。 在 ARM 设备上创建设备驱动节点,编写用户空间应用程序,对驱动程序进行测试。(1)、编译驱动程序/UP-Magic210/SRC/exp/driver/01_demo /demo.c,手工加载驱动程序,通过设备号建立驱动设备节点,执行应用程序测试该驱动及设备,分析驱动
20、程序demo.c。进入实验目录编译源程序rootlocalhost /# cd /UP-Magic210/SRC/exp/driver/01_demo/ 清除中间代码,重新编译rootlocalhost 01_demo# make clean rootlocalhost 01_demo# make当前目录下生成驱动程序demo.ko和应用测试程序test_demo。启动 UP-Magic210 实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录(注意:虚拟机IP地址需要设置为:192.168.12.157)。rootUP-TECH yaffs# mount -t nfs -o nolo
21、ck 192.168.12.157:/UP-Magic210 /mnt/nfs进入串口终端的 NFS 共享实验目录rootUP-TECH yaffs# cd /mnt/nfs/SRC/exp/driver/01_demo/手动加载驱动程序 demo.korootUP-TECH 01_demo# insmod demo.ko通过设备号建立驱动设备节点 rootUP_210 01_demo# mknod /dev/demo c 251 0执行应用程序测试该驱动及设备,分析应用程序测试结果。rootUP-TECH 01_demo# ./test_demo(2)、请参考驱动程序demo.c,编写一个虚
22、拟字符设备驱动程序并进行调试,该虚拟字符设备驱动程序完成如下功能: 在核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件节点; 在核模块的退出函数中,实现设备注销,删除该设备文件节点; 实现file_operations设备驱动文件结构体中的open、read、write、ioctl和release函数功能,其中: open函数:设置一个计数器count,每调用一次open函数,计数器count加1。 read函数:读取用户写入的字符串数据的排列结果。 write函数:实现将用户写入的字符串数据,按照每个字符的ASCII值逆序或升序排序(根据开关值asc排序:asc=0,逆序
23、排序;asc=1,升序排序;)。 ioctl函数:设置排序方式开关值asc。 release函数:每调用一次release函数,计数器count减1。5. 实验中遇到的问题及解决方法。没有修改makefile文件直接进行编译导致出错。实验前没有认真阅读实验原理,看懂实验代码,所以在使用make命令以后无法实现。最后在同学的帮助下找到了原因。忽略了自己使用的是gcc编译而不是交叉编译,因而没有设置节点。尝试了很多次以后才发现了问题,期间以为是test_demo文件的问题,但是导入导出很多次都没有解决,问了同学才找到了问题。实验四 LED 驱动及控制实验 了解 ARM 设备外围电路结构与接口原理
24、熟悉 Linux 系统下硬件驱动编程 编程实现对嵌入式设备上 LED 灯的控制 阅读 UP-Magic210 平台硬件文档,熟悉 ARM 处理硬件外围接口电路 编程实现 UP-Magic210 平台设备上 LED 驱动及应用测试程序编写UP-Magic210 平台设备上 LED 驱动及应用测试程序并进行调试,该LED驱动程序完成如下功能: 实现file_operations设备驱动文件结构体中的ioctl函数,完成如下功能: 一次调用控制所有的LED亮或灭; 控制单个LED亮或灭; 实现流水灯显示,流水灯显示效果自行定义,流水灯循环显示次数由用户应用程序传入。程序:驱动程序分析:linux/kernel.hlinux/fs.hlinux/miscdevice.hlinux/delay.hasm/irq.hasm/arch/regs-gpio.hasm/hardware.hGPL#define DEVICE_NAME leds /驱动名称#define DEVICE_MAJOR 231 /驱动主设备号#define DEVICE_MINOR 0 /驱动次设备号/声明字符设备类结构struct c
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1