当前位置:首页 > 单片机 > 单片机
[导读]在自己的工作目录下建立helloworld_driver.c#include#include//代码遵守的license:BSDGPLMODULE_LICENSE("DualBSD/GPL");//代码作者声明MODULE_AUTHOR("bruce");//模块初始化staticint__inithello_init(void){printk

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

#include

#include

//代码遵守的license:BSDGPL

MODULE_LICENSE("DualBSD/GPL");

//代码作者声明

MODULE_AUTHOR("bruce");

//模块初始化

staticint__inithello_init(void)

{

printk(KERN_ALERT"Helloworld!n");

return0;

}

//模块退出

staticvoid__exithello_exit(void)

{

printk(KERN_ALERT"Goodbyeworld!n");

}

module_init(hello_init);

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>"
#defineKERN_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

KERNELDIR:=/home/workdir/kernel/linux-2.6.38

PWD:=$(shellpwd)

modules:

$(MAKE)-C$(KERNELDIR)M=$(PWD)modules

modules_install:

$(MAKE)-C$(KERNELDIR)M=$(PWD)modules_install

obj-m:=helloworld_driver.o

clean:

rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions*.order*.symvers



执行makemodules生成helloworld_driver.ko文件。


将helloworld_driver.ko下载到开发板文件系统中,执行insmodhelloworld_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操作系统的核心具有模块化的特性,因此在编译核心时,无需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待需要时再分别载入。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

嵌入式系统已经成为我们日常生活中不可或缺的一部分,它们存在于我们的手机、家用电器、汽车、医疗设备等各个领域。而Linux操作系统在嵌入式领域中也占据着重要地位。本文将深入探讨嵌入式Linux的特点和特性,以及如何学习这一...

关键字: 嵌入式系统 Linux操作系统 设备驱动

摘要:基于Linux字符设备操作接口和各类串行总线的共,性,按照分层的思想,抽象出各种总线的统一接口。统一接口的应用层API与底层的具体总线操作形式无关,而且便于应用系统的升级和移植。文中给出了一种多种串行总线统一接口的...

关键字: 统一接口 嵌入式系统 Linux 设备驱动 串行总线

通过一个最简单的LED驱动实例来展示字符设备驱动程序设计,开发及测试的整个过程。1.实验目的(1)了解LED原理及其与S3C2410的接口电路设计。(2)了解S3C2410芯片的I/O端口配置方法。(3)通过S3C2...

关键字: ARM LED 设备驱动

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

关键字: tiny6410 设备驱动 led字符

设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能:  ·设备初始化、释放;  ·提供各类设备服务;  ·负责内核和设备之间的数据

关键字: arm处理器 Linux s3c2410 移植 设备驱动

在工作目录下建立helloworld.c文件#includemain(){printf("helloworld!\\n");}保存关闭后。编译helloworld文件:root@snail:/home...

关键字: 交叉编译 tiny6410

《嵌入式Linux初级实验s3c2410》设备驱动开发=硬件控制+内核API+内核驱动框架1.设备驱动和操作系统1.1无操作系统时的设备驱动在没有操作系统的情况下,设备驱动的接口直接提交给应用软件工程师,应用软件没有跨越

关键字: ARM 设备驱动

操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。设备驱动程序是内核的一部分,硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序...

关键字: 基础教程 嵌入式linux 操作系统 设备驱动

设备驱动程序可以使用模块的方式动态加载到内核中去。加载模块的方式与以往的应用程序开发有很大的不同。以往在开发应用程序时都有一个main()函数作为程序的入口点,而在驱动开发时却没有main()函数,模块在调用insmod...

关键字: 基础教程 字符设备驱动 嵌入式linux 操作系统 设备驱动

FS2410开发板的S3C2410处理器具有117个多功能通用I/O(GPIO)端口管脚,包括GPIO 8个端口组,分别为GPA(23个输出端口)、GPB(11个输入/输出端口)、GPC(16个输入/输出端口)、GPD(...

关键字: 基础教程 嵌入式linux 操作系统 设备驱动 gpio驱动程序
关闭