注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

最简单的字符设备驱动程序  

2012-09-08 23:01:29|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
驱动程序:
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>

int lcd_open(struct inode *inode, struct file *file)
{
    printk("lcd_open\n");
    return 0;
}
ssize_t lcd_write(struct file *file, const char __user *user, size_t size, loff_t *off)
{
    printk("lcd_write\n");
    return 0;
}

static struct file_operations lcd_operation = {
    .owner=THIS_MODULE,
    .open=lcd_open,
    .write=lcd_write,   
};

int lcd_init(void)
{
    register_chrdev(111,"lcd",&lcd_operation);
    return 0;
}

void lcd_exit(void)
{
    unregister_chrdev(111,"lcd");
}

module_init(lcd_init);
module_exit(lcd_exit);

测试程序:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
    int fd;
    int val=1;
    fd=open("/dev/xxx",O_RDWR);
    if(fd<0)
        {
            printf("can't open\n");
            return 0;
        }
    write(fd , &val , 4);
    return 0;
}

说明:
1、在注册驱动程序的时候,根据主设备号将分配的file_operations 结构体放到内核的数组里面。我们在用户空间open打开设备的方式是这样的:根据名字找到设备节点,设备节点会对应主设备号,根据主设备号就找到了file_operations 结构体。所以我们还需要创建设备节点:mknod /dev/xxx c 111 0。由此我们也可以看出,用户空间的open的名字“xxx”,可以跟内核空间的设备名字可以不一致,因为并不是通过设备名找到file_operations 结构体的,只要保证open的名字“xxx”与设备节点的名字相一致,而设备节点的主设备号跟内核设备的主设备号相一致就可以了。因为open函数根据设备名找到设备节点,有根据设备节点的主设备号来找到file_operations 结构体,最终调用file_operations 里面注册的open函数!

2write (int fd,const void * buf,size_t count);
write函数会将buf里面的内核写入到fd代表的文件里面,写入的字节数是count!

3、register_chrdev分析
register_chrdev(111,"lcd",&lcd_operation);
      __register_chrdev(major, 0, 256, name, fops);
            //注册一个主设备号
            __register_chrdev_region(major, baseminor, count, name);
            //分配一个struct cdev结构体,里面有struct file_operations结构体
            cdev_alloc();
            //设置struct cdev结构体
            cdev->owner = fops->owner;
            cdev->ops = fops;
            //根据主设备号将struct cdev添加到一个数组里面去
            cdev_add(cdev, MKDEV(cd->major, baseminor), count);
4、 register_chrdev(111,"lcd",&lcd_operation);
如果主设备号设为0,就会自动分配主设备号!分配到的主设备号会作为返回值!装载驱动后,可以再开发板上:cat /proc/devices开查看主设备号,以便创建设备节点!
  评论这张
 
阅读(1627)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017