查看: 51|回复: 0

[原创] 【TI的一代经典旷世神U—电鱼派】(四)+第一个驱动程序

[复制链接]

1

主题

0

好友

881

积分

举人

Rank: 4

  • TA的每日心情

    昨天 09:09
  • 签到天数: 166 天

    [LV.7]常住居民III

    发表于 2016-12-17 15:56:54 |显示全部楼层
    电鱼派板卡分享汇总帖

    再上上一篇中遇到的无法生成uImage问题,我调试了半天最后也没有解决,怀疑可能是我胡乱更新造成的,不得以我又重新安装了一遍编译环境这回一次就成功了,怀疑可能是我的开发环境搭建过程不对造成的。然而并不止因为这个问题,而是因为我把内核源码放在了virtualbox共享文件夹里面进行编译。当我移到ubuntu系统的文件夹里就没有问题了

    今天的程序很简单我们先编写一个小小。。。的驱动程序hello_module。先附上代码:
    1. #include <linux/module.h>
    2. #include <linux/kernel.h>
    3. #include <linux/init.h>

    4. static int hello_init(void)
    5. {
    6.         printk(KERN_ERR "hello module init\n");
    7.         return 0;
    8. }

    9. static void hello_exit(void)
    10. {
    11.         printk(KERN_ERR "hello module exit\n");
    12. }

    13. module_init(hello_init);
    14. module_exit(hello_exit);

    15. MODULE_LICENSE("GPL");
    复制代码
    首先是几个必须的头文件。然后是驱动加载时调用的程序”hello_init“和卸载驱动是调用的程序”hello_exit“。这个程序实现的功能就是在加载驱动时打印”hello module init",卸载驱动时打印“hello module exit”。
    通过module_init()和module_exit宏定义初始化。可以这样理解,使用module_init()和module_exit()初始化之后,当我们试用insmod加载我们的驱动时,调用的是hello_init()函数。试用rmmod卸载驱动时,调用的是hello_exit()函数。
    下面来看看makefile
    1. KERN_DIR = /dianyu/am335x-sdk6.0-kernel-dianyu

    2. all:
    3.         make -C $(KERN_DIR) M=`pwd` modules

    4. clean:
    5.         make -C $(KERN_DIR) M=`pwd` modules clean
    6.         rm -rf modules.order

    7. obj-m        += first_drv.o
    复制代码
    这个makefile的好处就是可以在任意位置编译,关键就在于第一句话KERN_DIR = /dianyu/am335x-sdk6.0-kernel-dianyu,当执行makefile时,会自动到我们制定的内核源码中进行编译。
    下面来看看实际的效果。
    微信截图_20161218212717.png
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /1 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-1-19 04:22 , Processed in 0.096672 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部