Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145022
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-04 13:11
文章分类

全部博文(29)

文章存档

2015年(2)

2014年(27)

我的朋友

分类: 嵌入式

2014-07-10 16:28:11

一,写驱动函数的步骤
1 写出led_open(),led_read()驱动函数。
2 怎么把驱动函数告诉内核
    a:定义一个file_operations结构,将驱动函数填充进去。
    b:把这个结构告诉内核,通过函数register_chrdev(major,"led_drv",&led_drv_fops);函数参数为主设备号,设备名,file_operations结构。在一个内核数组chrdev中以major为索引,将file_operations结构挂进去。
    c:谁来调用上述函数,即驱动的入口函数,static int led_drv_init(void);
    d:修饰入口函数,module_init(led_drv_init);


二,编写驱动程序
#include
#include
#include
#include
#include
#include
#include
#include
#include  
#include
//注意这两个头文件与视频所用内核不同,需要修改
static int led_drv_open(struct inode *inode, struct file *file)
{
        printk("led_drv_open\n");
        return 0;
}
static ssize_t led_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
        printk("led_drv_write\n");
        return 0;
}
static struct file_operations led_drv_fops = {
    .owner  =   THIS_MODULE,    
    .open   =   led_drv_open,     
    .write = led_drv_write,   
};
static int led_drv_init(void)
{
       register_chrdev(111,"led_drv",&led_drv_fops);
}
static void led_drv_exit(void)
{
        unregister_chrdev(111, "led_drv"); 
}
module_init(led_drv_init);
module_exit(led_drv_exit);
MODULE_LICENSE("GPL");

三,测试程序
#include
#include
#include
#include
int main(int argc, char **argv)
{
        int fd;
        int val = 1;
        fd = open("/dev/led_drv", O_RDWR);
        if (fd < 0)
        {
            printf("can't open!\n");
        }
        write(fd, &val, 4);
        return 0;
}

四,编写makefile
KERN_DIR = /home/wxudong/mini2440/linux-2.6.32.2
all:
    make -C $(KERN_DIR) M=`pwd` modules 
clean:
    make -C $(KERN_DIR) M=`pwd` modules clean
    rm -rf modules.order
obj-m += led_drv.o

五,  a,执行make生成led_drv.ko,
         b,执行arm-linux-gcc -o led_drv_test led_drv_test.c    生成执行文件
         c,将两个文件拷贝到开发板
         d,chmod  777  led_drv_test修改文件属性
         e,insmod mini2440_leds.ko加载驱动
         f,mknod /dev/led_drv c 111 0创建设备节点
        g,./led_drv_test     显示结果led_drv_open     led_drv_write

        

阅读(1936) | 评论(0) | 转发(0) |
0

上一篇:Linux内核移植

下一篇:引用的概念

给主人留下些什么吧!~~