首先,感谢BOSS@spacexplorer 的热情帮助,学习过程中遇到很多问题,BOSS都很快帮忙解决了。谢谢BOSS!
Linux设备管理的主要任务是控制设备完成输入输出操作,所以又成为输入/输出(I/O)子系统。它的任务是把各种设备硬件的复杂物理特性的细节屏蔽起来,提供一个对各种不同设备使用统一方式进行操作的接口。Linux把设备当作是特殊的文件,系统通过处理文件接口——虚拟文件系统VFS来管理和控制各种设备。
Linux设备被分为3类:字符设备、块设备和网络设备。
字符设备是以字符为单位输入/输出数据的设备,一般不需要使用缓冲区而直接对它进行读写,如打印机。
块设备是一定大小的数据块为单位输入/输出数据的,一般要使用缓冲区在设备与内存之间传送数据,如磁盘。
网络设备是通过通信网络传输数据的设备,一般指与通信网络连接的网络适配器等,如以太网卡。Linux使用套接口(socket)以文件I/O方式提供了对网络数据的访问。
Hello_world模块驱动是linux驱动开发的入门级模块。编写过程如下:
1.在workspace文件下创建一个program文件夹,然后在program文件下创建一个helloworld文件夹。在helloworld文件夹下创建hello_module.c,该文件代码如下:
- #include
- #include
- #include
- MODULE_LICENSE("Dual BSD/GPL");
- static int hello_init(void)
- {
- printk(KERN_ALERT "Hello,world\n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ALERT "Goodbye,world\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
复制代码这个模块定义了两个函数,一个在模块加载到内核时被调用(hello_init),一个在模块被去除时使用(hello_exit).printk函数跟printf相似,区别在于printf用在C库下,printk用在内核下。
2.编写makefile文件。本人对makefile文件编写不熟悉,在这步上卡了很久,多亏BOSS的帮助。代码如下:
- obj-m := hello_module.o
- KERNEL_DIR := /root/workspace/s3c-linux.jyx
- PWD := $(shell pwd)
- all:
- make ARCH=arm CROSS_COMPILE=arm-linux- -C /root/workspace/s3c-linux.jyx/ M=$(PWD) modules
- clean:
- rm *.o *.ko
复制代码代码具体意思我就不解释了,我也只刚学而已。反正makefile文件需要实现定义内核位置,选择编译器等功能。
在这步开发中遇到的问题是:我一开始使用的是君益兴提供的fedora18环境中/home/jyxtec/workspace/kernel/s3c-linux下的内黑,这个内核可能有问题,执行make指令后会报错。改成/root/workspace/s3c-linux.jyx下的内核就可以编译通过了。
3.执行make指令,编译完成后会有hello_module.ko这个文件。把这个文件从虚拟机中传到PC机上。
4.通过串口连接开发板然后上电。进入/lib/modules下创建3.2.50文件夹。此步不完成会导致之后无法卸载驱动。
- Please press Enter to activate this console.
- [root@jyxtec /]# uname -r
- 3.2.50
- [root@jyxtec /]# ls
- bin linuxrc root usr
- dev lost+found sbin var
- etc mnt sdcard www
- g_file_storage.ko opt sys
- home proc tmp
- lib qtenv usbdisk
- [root@jyxtec /]# cd lib
- [root@jyxtec /lib]# ls
- ld-2.9.so libjpeg.so.62 libpthread.so.0
- ld-linux.so.3 libjpeg.so.62.0.0 libresolv-2.9.so
- ldscripts libm-2.9.so libresolv.so.2
- libBrokenLocale-2.9.so libm.so.6 librt-2.9.so
- libBrokenLocale.so.1 libmad.so librt.so.1
- libSegFault.so libmad.so.0 libsocketcan.so
- libanl-2.9.so libmad.so.0.2.1 libsocketcan.so.2
- libanl.so.1 libmemusage.so libsocketcan.so.2.2.0
- libblkid.so libnsl-2.9.so libss.so
- libblkid.so.1 libnsl.so.1 libss.so.2
- libblkid.so.1.0 libnss_compat-2.9.so libss.so.2.0
- libc-2.9.so libnss_compat.so.2 libstdc++.la
- libc.so.6 libnss_dns-2.9.so libstdc++.so
- libcom_err.so libnss_dns.so.2 libstdc++.so.6
- libcom_err.so.2 libnss_files-2.9.so libstdc++.so.6.0.10
- libcom_err.so.2.1 libnss_files.so.2 libstdc++.so.6.0.13
- libcrypt-2.9.so libnss_hesiod-2.9.so libsupc++.la
- libcrypt.so.1 libnss_hesiod.so.2 libthread_db-1.0.so
- libdl-2.9.so libnss_nis-2.9.so libthread_db.so.1
- libdl.so.2 libnss_nis.so.2 libts-1.0.so.0
- libe2p.so libnss_nisplus-2.9.so libts-1.0.so.0.0.0
- libe2p.so.2 libnss_nisplus.so.2 libts.so
- libe2p.so.2.3 libpcprofile.so libutil-2.9.so
- libext2fs.so libpng.la libutil.so.1
- libext2fs.so.2 libpng.so libuuid.so
- libext2fs.so.2.4 libpng.so.3 libuuid.so.1
- libgcc_s.so libpng.so.3.23.0 libuuid.so.1.2
- libgcc_s.so.1 libpng.so.3.35.0 libz.so
- libid3tag.so libpng12.la libz.so.1
- libid3tag.so.0 libpng12.so libz.so.1.2.3
- libid3tag.so.0.3.0 libpng12.so.0 modules
- libiw.so.29 libpng12.so.0.23.0 pkgconfig
- libjpeg.la libpng12.so.0.35.0 ts
- libjpeg.so libpthread-2.9.so
- [root@jyxtec /lib]# cd modules
- [root@jyxtec modules]# ls
- 2.6.21.5-cfs-v19 3.2.50+
- [root@jyxtec modules]# mkdir 3.2.50
- [root@jyxtec modules]# ls
- 2.6.21.5-cfs-v19 3.2.50 3.2.50+
复制代码
5.把hello_module.ko传送到helper2416开发板上。
我使用的是串口传送的方式,具体方法可以参考jyx提供的手册。过程如下
- [root@jyxtec 3.2.50]# rz
- rz waiting to receive.
- Starting zmodem transfer. Press Ctrl+C to cancel.
- 100% 22 KB 11 KB/s 00:00:02 0 Errors
- [root@jyxtec 3.2.50]# ls
- hello_module.ko
复制代码
6.加载驱动。使用insmod指令即可,加载成功即可看到“Hello,wolrd”字符串。同时可用lsmod查看加载了什么驱动。
- [root@jyxtec 3.2.50]# insmod ./hello_module.ko
- Hello,world
- [root@jyxtec 3.2.50]# lsmod
- hello_module 652 0 - Live 0xbf000000 (O)
复制代码
7.卸载驱动。使用rmmod指令。如果未完成第4步,在这步过程中会报错:“NO SUCH FILES.... ”.卸载成功即可见到“Goodbye,world”
- [root@jyxtec 3.2.50]# rmmod hello_module
- Goodbye,world
复制代码至此,整个helloworld驱动完成了,皆下来可以开发更加高级的驱动。大家可以按我的流程自己尝试下。希望大家都成功!
论坛ID:cer1991
提交时间:2014.08.22
本文来自论坛,点击查看完整帖子内容。