zoukankan      html  css  js  c++  java
  • Tiny6410 设备驱动之helloworld

    在自己的工作目录下建立helloworld_driver.c

    1. #include <linux/init.h>  
    2. #include <linux/module.h>  
    3.   
    4. //代码遵守的license:BSD GPL  
    5. MODULE_LICENSE("Dual BSD/GPL");  
    6.   
    7. //代码作者声明  
    8. MODULE_AUTHOR("bruce");  
    9.   
    10. //模块初始化  
    11. static int __init hello_init(void)  
    12. {  
    13.     printk(KERN_ALERT "Hello world! ");  
    14.     return 0;  
    15. }  
    16. //模块退出  
    17. static void  __exit hello_exit(void)  
    18. {  
    19.     printk(KERN_ALERT "Goodbye world! ");  
    20. }  
    21.   
    22. module_init(hello_init);  
    23. module_exit(hello_exit);  

    补充下:

    1. printk输出跟输出的日志级别有关系,当输出日志级别比控制台的级别高时,就会显示在控制台上,当比控制台低时,则会记录在/var/log/message中。

    2. printk()并不是设计用来同用户交互的,虽然我们在 hello-1就是出于这样的目的使用它!它实际上是为内核提供日志功能, 记录内核信息或用来给出警告。因此,每

      个printk() 声明都会带一个优先级,就像你看到的<1>KERN_ALERT 那样。内核总共定义了八个优先级的宏, 所以你不必使用晦涩的数字代码,并且你可以从文

      件linux/kernel.h查看这些宏和它们的意义。如果你 不指明优先级,默认的优先级DEFAULT_MESSAGE_LOGLEVEL将被采用。

    #define KERN_EMERG     "<0>"
    #define KERN_ALERT    "<1>"
    #define KERN_CRIT      "<2>"
    #define KERN_ERR       "<3>"
    #define KERN_WARNING   "<4>"
    #define KERN_NOTICE    "<5>"
    #define KERN_INFO      "<6>"
    #define KERN_DEBUG     "<7>"



    在同目录下建立Makefile

    1. KERNELDIR :=/home/workdir/kernel/linux-2.6.38  
    2.   
    3. PWD :=$(shell pwd)  
    4.   
    5. modules:  
    6.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
    7.   
    8. modules_install:  
    9.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install      
    10.   
    11. obj-m:=helloworld_driver.o  
    12.   
    13. clean:  
    14.     rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers  



    执行make modules生成helloworld_driver.ko文件。


    helloworld_driver.ko下载到开发板文件系统中,执行insmod helloworld_driver.ko加载驱动模块,串口将打印如下信息:

    成功!

    卸载helloworld_driver.ko


    成功!

    这是最简单的设备驱动示例!

    补充知识:

       insmod——载入模块

     

      insmod 就是install module的缩写

     

      功能说明:载入模块。

     

      语法:insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]

     

      说明:Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序

     

    参数

      -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。

     

      -k 将模块设置为自动卸除。

     

      -m 输出模块的载入信息。

     

      -o<模块名称> 指定模块的名称,可使用模块文件的文件名。

     

      -p 测试模块是否能正确地载入kernel。

     

      -s 将所有信息记录在系统记录文件中。

     

      -v 执行时显示详细的信息。

     

      -x 不要汇出模块的外部符号。

     

      -X 汇出模块所有的外部符号,此为预设值。


      rmmod——删除不必要的模块

      rmmod 即remove module的简称

      功能说明:删除模块。
     
      语法:rmmod [-as][模块名称...]
     
      说明:执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,务须把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。
     
      参数:
     
      -a 删除所有目前不需要的模块。
     
      -s 把信息输出至syslog常驻服务,而非终端机界面。

       lsmod——显示已载入系统的模块

     

      lsmod 其实就是list modules的缩写,即 列出所有模块.

     

      功能说明:显示已载入系统的模块。

     

      语法:lsmod

     

      说明:执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,无需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待需要时再分别载入。

  • 相关阅读:
    第十一课:Python语句讲解
    第十节课:再议数据结构与数据类型
    第九节课:这些难缠的符号
    第八节课:基本数据结构习题
    第七节课:字典
    第六节课:元组和集合
    第五节课:Python列表的应用
    Oracle问题处理
    springmvc读取服务器磁盘图片,显示于前台页面
    spring从服务器磁盘读取图片,然后显示于前端页面上
  • 原文地址:https://www.cnblogs.com/ljf181275034/p/3219180.html
Copyright © 2011-2022 走看看