注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
cer1991的个人空间 https://home.eeworld.com.cn/space-uid-414872.html [收藏] [复制] [分享] [RSS]
日志

HELPer2416学习心得——linux下开发hello_world驱动

热度 1已有 1306 次阅读2014-8-22 21:04 |个人分类:chaos

首先,感谢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,该文件代码如下:
  1. #include
  2. #include
  3. #include

  4. MODULE_LICENSE("Dual BSD/GPL");

  5. static int hello_init(void)
  6. {
  7.         printk(KERN_ALERT "Hello,world\n");
  8.         return 0;
  9. }

  10. static void hello_exit(void)
  11. {
  12.         printk(KERN_ALERT "Goodbye,world\n");
  13. }

  14. module_init(hello_init);
  15. module_exit(hello_exit);
复制代码
这个模块定义了两个函数,一个在模块加载到内核时被调用(hello_init),一个在模块被去除时使用(hello_exit).printk函数跟printf相似,区别在于printf用在C库下,printk用在内核下。

2.编写makefile文件。本人对makefile文件编写不熟悉,在这步上卡了很久,多亏BOSS的帮助。代码如下:
  1. obj-m := hello_module.o
  2. KERNEL_DIR := /root/workspace/s3c-linux.jyx
  3. PWD := $(shell pwd)
  4. all:
  5.         make ARCH=arm CROSS_COMPILE=arm-linux- -C /root/workspace/s3c-linux.jyx/ M=$(PWD) modules
  6. clean:
  7.         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文件夹。此步不完成会导致之后无法卸载驱动。
  1. Please press Enter to activate this console.
  2. [root@jyxtec /]# uname -r
  3. 3.2.50
  4. [root@jyxtec /]# ls
  5. bin                linuxrc            root               usr
  6. dev                lost+found         sbin               var
  7. etc                mnt                sdcard             www
  8. g_file_storage.ko  opt                sys
  9. home               proc               tmp
  10. lib                qtenv              usbdisk
  11. [root@jyxtec /]# cd lib
  12. [root@jyxtec /lib]# ls
  13. ld-2.9.so               libjpeg.so.62           libpthread.so.0
  14. ld-linux.so.3           libjpeg.so.62.0.0       libresolv-2.9.so
  15. ldscripts               libm-2.9.so             libresolv.so.2
  16. libBrokenLocale-2.9.so  libm.so.6               librt-2.9.so
  17. libBrokenLocale.so.1    libmad.so               librt.so.1
  18. libSegFault.so          libmad.so.0             libsocketcan.so
  19. libanl-2.9.so           libmad.so.0.2.1         libsocketcan.so.2
  20. libanl.so.1             libmemusage.so          libsocketcan.so.2.2.0
  21. libblkid.so             libnsl-2.9.so           libss.so
  22. libblkid.so.1           libnsl.so.1             libss.so.2
  23. libblkid.so.1.0         libnss_compat-2.9.so    libss.so.2.0
  24. libc-2.9.so             libnss_compat.so.2      libstdc++.la
  25. libc.so.6               libnss_dns-2.9.so       libstdc++.so
  26. libcom_err.so           libnss_dns.so.2         libstdc++.so.6
  27. libcom_err.so.2         libnss_files-2.9.so     libstdc++.so.6.0.10
  28. libcom_err.so.2.1       libnss_files.so.2       libstdc++.so.6.0.13
  29. libcrypt-2.9.so         libnss_hesiod-2.9.so    libsupc++.la
  30. libcrypt.so.1           libnss_hesiod.so.2      libthread_db-1.0.so
  31. libdl-2.9.so            libnss_nis-2.9.so       libthread_db.so.1
  32. libdl.so.2              libnss_nis.so.2         libts-1.0.so.0
  33. libe2p.so               libnss_nisplus-2.9.so   libts-1.0.so.0.0.0
  34. libe2p.so.2             libnss_nisplus.so.2     libts.so
  35. libe2p.so.2.3           libpcprofile.so         libutil-2.9.so
  36. libext2fs.so            libpng.la               libutil.so.1
  37. libext2fs.so.2          libpng.so               libuuid.so
  38. libext2fs.so.2.4        libpng.so.3             libuuid.so.1
  39. libgcc_s.so             libpng.so.3.23.0        libuuid.so.1.2
  40. libgcc_s.so.1           libpng.so.3.35.0        libz.so
  41. libid3tag.so            libpng12.la             libz.so.1
  42. libid3tag.so.0          libpng12.so             libz.so.1.2.3
  43. libid3tag.so.0.3.0      libpng12.so.0           modules
  44. libiw.so.29             libpng12.so.0.23.0      pkgconfig
  45. libjpeg.la              libpng12.so.0.35.0      ts
  46. libjpeg.so              libpthread-2.9.so
  47. [root@jyxtec /lib]# cd modules
  48. [root@jyxtec modules]# ls
  49. 2.6.21.5-cfs-v19  3.2.50+
  50. [root@jyxtec modules]# mkdir 3.2.50
  51. [root@jyxtec modules]# ls
  52. 2.6.21.5-cfs-v19  3.2.50            3.2.50+
复制代码

5.把hello_module.ko传送到helper2416开发板上。
   我使用的是串口传送的方式,具体方法可以参考jyx提供的手册。过程如下
  1. [root@jyxtec 3.2.50]# rz
  2. rz waiting to receive.
  3. Starting zmodem transfer.  Press Ctrl+C to cancel.
  4.   100%      22 KB   11 KB/s 00:00:02       0 Errors

  5. [root@jyxtec 3.2.50]# ls
  6. hello_module.ko
复制代码

6.加载驱动。使用insmod指令即可,加载成功即可看到“Hello,wolrd”字符串。同时可用lsmod查看加载了什么驱动。
  1. [root@jyxtec 3.2.50]# insmod ./hello_module.ko
  2. Hello,world
  3. [root@jyxtec 3.2.50]# lsmod
  4. hello_module 652 0 - Live 0xbf000000 (O)
复制代码

7.卸载驱动。使用rmmod指令。如果未完成第4步,在这步过程中会报错:“NO SUCH FILES.... ”.卸载成功即可见到“Goodbye,world”
  1. [root@jyxtec 3.2.50]# rmmod hello_module
  2. Goodbye,world
复制代码
至此,整个helloworld驱动完成了,皆下来可以开发更加高级的驱动。大家可以按我的流程自己尝试下。希望大家都成功!

论坛ID:cer1991
提交时间:2014.08.22


本文来自论坛,点击查看完整帖子内容。

发表评论 评论 (1 个评论)
回复 zhkj2008 2014-12-4 18:21
我按你的做的,为什么make时会提示:
Makefile:7: *** 遗漏分隔符  (您的意思是用 TAB 代替 8 个空格?)。 停止。  
这是怎么回事,另外Makefile里这句是什么意思?  KERNEL_DIR := /root/workspace/s3c-linux.jyx    这个目录就是内核解压编译的目录吗

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章