Tiny6410 设备驱动之helloworld
2013-07-27 10:54
246 查看
在自己的工作目录下建立helloworld_driver.c
[cpp] view plaincopyprint?
#include <linux/init.h>
#include <linux/module.h>
//代码遵守的license:BSD GPL
MODULE_LICENSE("Dual BSD/GPL");
//代码作者声明
MODULE_AUTHOR("bruce");
//模块初始化
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello world!\n");
return 0;
}
//模块退出
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
补充下:
1. printk输出跟输出的日志级别有关系,当输出日志级别比控制台的级别高时,就会显示在控制台上,当比控制台低时,则会记录在/var/log/message中。
2. printk()并不是设计用来同用户交互的,虽然我们在 hello-1就是出于这样的目的使用它!它实际上是为内核提供日志功能, 记录内核信息或用来给出警告。因此,每
个printk() 声明都会带一个优先级,就像你看到的<1>和[b]KERN_ALERT[/b] 那样。内核总共定义了八个优先级的宏, 所以你不必使用晦涩的数字代码,并且你可以从文
件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
[cpp] view plaincopyprint?
KERNELDIR :=/home/workdir/kernel/linux-2.6.38
PWD :=$(shell pwd)
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
执行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较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。
-k 将模块设置为自动卸除。
-m 输出模块的载入信息。
-o<模块名称> 指定模块的名称,可使用模块文件的文件名。
-p 测试模块是否能正确地载入kernel。
-s 将所有信息记录在系统记录文件中。
-v 执行时显示详细的信息。
-x 不要汇出模块的外部符号。
-X 汇出模块所有的外部符号,此为预设值。
语法:rmmod [-as][模块名称...]
说明:执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,务须把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。
参数:
-a 删除所有目前不需要的模块。
-s 把信息输出至syslog常驻服务,而非终端机界面。
lsmod——显示已载入系统的模块
lsmod 其实就是list modules的缩写,即 列出所有模块.
功能说明:显示已载入系统的模块。
语法:lsmod
说明:执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,无需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待需要时再分别载入。
[cpp] view plaincopyprint?
#include <linux/init.h>
#include <linux/module.h>
//代码遵守的license:BSD GPL
MODULE_LICENSE("Dual BSD/GPL");
//代码作者声明
MODULE_AUTHOR("bruce");
//模块初始化
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello world!\n");
return 0;
}
//模块退出
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
补充下:
1. printk输出跟输出的日志级别有关系,当输出日志级别比控制台的级别高时,就会显示在控制台上,当比控制台低时,则会记录在/var/log/message中。
2. printk()并不是设计用来同用户交互的,虽然我们在 hello-1就是出于这样的目的使用它!它实际上是为内核提供日志功能, 记录内核信息或用来给出警告。因此,每
个printk() 声明都会带一个优先级,就像你看到的<1>和[b]KERN_ALERT[/b] 那样。内核总共定义了八个优先级的宏, 所以你不必使用晦涩的数字代码,并且你可以从文
件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
[cpp] view plaincopyprint?
KERNELDIR :=/home/workdir/kernel/linux-2.6.38
PWD :=$(shell pwd)
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
执行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_driver
- 【Tiny6410 And Linux】—(2.1)—platform 总线、设备、驱动——代码
- 设备驱动之一---Helloworld
- 实战Linux设备驱动--万事开头难--HelloWorld
- 设备驱动之HelloWorld
- Tiny6410 简单的LED字符设备驱动
- 设备驱动----1.Linux内核模块-helloworld
- linux i2c 24c08 tiny6410 一个24c08的设备驱动
- linux设备驱动--HelloWorld
- linux设备驱动--HelloWorld
- Tiny6410 LED字符设备驱动
- tiny6410 linux混杂设备 led驱动
- ubuntu12.04下实现第一个设备驱动模块HelloWorld
- Tiny6410 简单的LED字符设备驱动
- Tiny6410杂项设备驱动之——led驱动
- Linux驱动开发----块设备驱动(内存模拟)Tiny6410
- 【Tiny6410 And Linux】—(2.1)—platform 总线、设备、驱动——原理
- LCD设备驱动 相关结构体
- 混杂设备驱动模型
- i2c 与 spi 设备在新版内核中不采用DTS设备树形式 在驱动添加设备信息(board_info)的方法