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

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. //代码遵守的license:BSD GPL
  4. MODULE_LICENSE("Dual BSD/GPL");
  5. //代码作者声明
  6. MODULE_AUTHOR("bruce");
  7. //模块初始化
  8. static int __init hello_init(void)
  9. {
  10. printk(KERN_ALERT "Hello world!\n");
  11. return 0;
  12. }
  13. //模块退出
  14. static void  __exit hello_exit(void)
  15. {
  16. printk(KERN_ALERT "Goodbye world!\n");
  17. }
  18. module_init(hello_init);
  19. 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. PWD :=$(shell pwd)
  3. modules:
  4. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  5. modules_install:
  6. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
  7. obj-m:=helloworld_driver.o
  8. clean:
  9. 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操作系统的核心具有模块化的特性,因此在编译核心时,无需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待需要时再分别载入。

Tiny6410 设备驱动之helloworld的更多相关文章

  1. 一步一步实现Linux设备驱动的Helloworld模块

    学了那么多程序语言,总是有一个Hello world开头,不禁感叹Hello world的强大.呵呵,废话少说,咋们的故事当然要从这个Hello world开始. 先查看自己OS使用的内核版本[don ...

  2. Tiny6410 LED字符设备驱动

    1.查看用户手册 led1.led2.led3.led4 连接的分别是 GPK4.GPK5.GPK6.GPK7 2.查询6410芯片手册 下面还需要3个步骤: 1.设置GPIO为OUTPUT. 将GP ...

  3. register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动

    内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1 ...

  4. Linux设备驱动开发环境的搭建(转)

    经过两周的摸索,终于对Linux设备驱动开发有了个初步的认识,下面对Linux设备驱动开发环境的搭建做个小结,以方便自己以后查询,同时也能给同道的初学者一点帮助. 刚接触Linux设备驱动时,初学者往 ...

  5. linux 设备驱动概述

    linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和 ...

  6. Linux设备驱动之USB

    Linux驱动框架分析(一)        事实上,Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更贴切一些,应该称为驱动器比较好吧)的结构体,结构体里面应该包含了驱动程序所需要的 ...

  7. 【驱动】linux设备驱动·入门

    linux设备驱动 驱动程序英文全称Device Driver,也称作设备驱动程序.驱动程序是用于计算机和外部设备通信的特殊程序,相当于软件和硬件的接口,通常只有操作系统能使用驱动程序. 在现代计算机 ...

  8. Linux设备驱动剖析之IIC(一)

    写在前面 由于IIC总线只需要两根线就可以完成读写操作,而且通信协议简单,一条总线上可以挂载多个设备,因此被广泛使用.但是IIC总线有一个缺点,就是传输速率比较低.本文基于Linux-2.6.36版本 ...

  9. Linux设备驱动剖析之SPI(一)

    写在前面 初次接触SPI是因为几年前玩单片机的时候,由于普通的51单片机没有SPI控制器,所以只好用IO口去模拟.最近一次接触SPI是大三时参加的校内选拔赛,当时需要用2440去控制nrf24L01, ...

随机推荐

  1. oracle储存过程,job,视图,触发器(记性不好,写个例子自己记)

    存储过程 create or replace procedure TestPro(Descerr out varchar2 ) is begin select * from test; excepti ...

  2. oracle instantclient basic +pl/sql 安装和配置

    oracle instantclient basic +pl/sql 安装和配置 大家都知道,用PL/SQL连接Oracle,是需要安装Oracle客户端软件的,oracle客户端有点大,比较耗资源. ...

  3. 关于delete

    上面三图在debug下,delete的时候会以fe ee覆盖指针所指向要回收内存前后较大一块区域的值. 下图对于release下delete的时候会先用fe ee覆盖指针所指位置起6*4=24字节, ...

  4. HDU1857题解(逆向思维trie)

    题目link:http://acm.hdu.edu.cn/showproblem.php?pid=1857 先简述一下题目: 有一个RXC的字母矩形,R,C在500内,要匹配m个单词,m在100000 ...

  5. C++对象的JSON序列化与反序列化探索完结-列表的序列化与反序列化

    在前两篇文章中,我们已经完成对普通对象以及复杂对象嵌套的序列化与反序列化,见如下地址: C++对象的JSON序列化与反序列化探索 C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化 ...

  6. 构造函数继承关键apply call

    主要我是要解决一下几个问题: 1.        apply和call的区别在哪里 2.        apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和 ...

  7. 把div固定在网页顶部

    很多网站都有把某一块固定在顶部的功能,今天上网搜搜然后自己又写了一遍,贴出来给大家看看,哪天用到的时候自己也可以随时看看 <!DOCTYPE html PUBLIC "-//W3C// ...

  8. Unity学习笔记(1):认识Unity

    Unity是什么? Unity是patterns & practices团队开发的一个轻量级.可扩展的依赖注入容器,具有如下的特性: 它提供了创建(或者装配)对象实例的机制,而这些对象实例可能 ...

  9. 判断IE版本的语句 [if lte IE 6]...[endif]

    <!–[if lte IE 6]>……<![endif]–>Ite:less than or equal to意思是小于或等于IE6浏览器,用于IE浏览器的条件注释,常用于CS ...

  10. linux命令之ps命令

    1.管道 linux命令管道通过|表示.一般在linux命令中|(管道)之前的命令会输出大量的结果,|(管道)之后的命令一般就是带有条件的,只将|前满足条件的结果显示出来. 2.grep命令 grep ...