LED灯驱动编写--寄存器操作
(转载请写明出处: http://blog.csdn.net/yby19870627/article/details/7407130 )
这里没有用的内存映射的方法,而是直接对寄存器进行操作,我建议在开发驱动的时候,用NFS挂载的方式进行开发,这样可以节省很多时间,NFS挂载方法可以从我以前的文章中找到。
平台:Fedora14
内核:linux-2.632.2
一、首先要编写最基本的模块,因为编程就是要一步一步调试的,这样才能发现问题,如果一开始不管三七二十一,先把代码写完再说,那当你make完看到那些错误的时候,那个时候,我估计你连死的心都有了。
1. 添加最基本的头文件:#include <linux/module.h>
#include <linux/init.h>
2. 编写模块初始化函数和模块推出函数
static int __init Led_init(void)
{
printk("<0>module--->Led_init\n");
}
//--------------------------------------------------------------------------------
static void __exit Led_exit(void)
{
printk("<0>module--->exitok!\n");
}
//---------------------------------------------------------------------------------
module_init(Led_init);
module_exit(Led_exit);
3. 编译程序,然后再insmod led.ko/rmmod led
看看是否输出了代码里面的两条打印语句。
二、第一步通过之后,那么就要开始添加新的代码了,我们是要注册设备的,所以需要定义一个设备号变量,同时要注册到内核中还需要一个struct cdev结构的变量,所以要定义
struct cdev led_cdev;
dev_t led_devno;
定义完之后还需要考虑到要有一个变量来存储主设备号,所以还要定义一个主设备号变量。而且还要定义主设备号和次设备号两个宏。
#define MAINLEDNO 108
#define MINORLEDNO 0
static int led_major;
定义struct file_operations结构,一开始里面可以什么都不写。
struct file_operations led_ops={
};
修改模块初始化函数。
static int __init Led_init(void)
{
printk("<0>module--->Led_init\n");
int result;
/