嵌入式linux字符设备驱动

转载 2012年03月30日 10:42:18
1. 我们需要先调用register_chrdev_region()或 alloc_chrdev_region()来向系统申请设备号

    int register_chrdev_region( dev_t first, unsigned int count, char *name );  //函数通过已知的设备号first来注册字符设备区域。

    int alloc_chrdev_region( dev_t *dev, unsigned int firstminor,  unsigned int count, char *name );  //若需要动态分配设备号,则使用该函数,此处dev作为指针,为仅用于输出的参数,分配成功后保存已分配范围的第一个编号。firstminor通常为0,表示第一个次设备号。

 2.释放设备号

    void unregister_chrdev_region( dev_t first, unsigned int count );
3.注册完字符设备区域之后

    需要使用cdev_init函数初始化cdev结构和 file_operations结构

    cdev->owner = THIS_MODULE;

    void cdev_init( struct cdev *cdev, struct file_operations *fops);  //为cdev结构指针创建内存,并将cdev->ops=fops;(抵岸科技注:源代码中并未见创建内存。cdev_init依次做了:cdev填充0,初始化表头,kobject成员初始化,将cdev->ops=fops)

    接着讲cdev加入到内核中    int cdev_add( struct cdev *dev, dev_t num, unsigned int count);

    完成字符设备的注册过程

    以上函数需要#include  <linux/cdev.h>

4. 自动创建字符设备节点

    下面的函数需要  #include <linux/device.h>.

    struct class *myclass;  //声明一个class结构用于创建字符设备节点

    myclass = class_create(THIS_MODULE,"myclass");  //"myclass"为类名

    device_create(myclass,NULL,devno,NULL,"leds%d",0);  //通过myclass结构创建字符设备,第二个参数是设备的parent,第三个参

    数是设备号,第四个参数是传入内核的驱动数据void *类型指针,如果没有可以设置成NULL,最后一个参数是const char* fmt, ...,就是

    格式化参数,即leds0

    完成上述过程后会在/dev中找到leds0设备

    貌似以前的老版本会用到devfs_mk_cdev来创建设备节点,但是最后发现linux-2.6.33并没有这个函数,应该是被上述函数取代

    了吧

5. 当然,还包括驱动Makefile的编写以及应用程序

    几处比较有用的参考文章:

    http://hi.baidu.com/hust_junejun/blog/item/d2dcfcedc09833d92e2e213f.html    //比较全面

    http://www.dzsc.com/data/html/2009-8-28/78412.html                                        //自动生成字符设备节点

    http://fanyihui1986.blog.163.com/blog/static/7844859200911325826783/        //小型总结  

6.TIPS

    printk(KERN_WARNING" this is the test ");

    KERN_ALERT

    KERN_WANING

    KERN_INFO

    KERN_ERR

    等等不同优先级 宏,具体可以查阅linux设备驱动程序三,字符设备驱动一章。

至于mknod console c 5 1 的意思也很相似:
console是设备的名字
c指字符设备
5是该设备在major.h中定义的标记
1是第一个子设备

mknod console c 5 1
console为设备文件名,自己随便取
c是指字符型设备 (可选b,块设备)
5是主设备号 /dev/devices里面记录现有的设备
找个没有用的就可以了
1是次设备号,当你要给两个同样的设备上一个驱动的时候就要分了,从0开始,1就是第二个了 ,对于字符设备,次设备号就表示同类型设备的不同设备。


嵌入式Linux字符设备驱动模型详解

在Linux系统中,设备的类型非常多。比如:字符设备,块设备,网络设备接口设备,PCI设备,USB设备,平台设备,混杂设备。设备类型不同,对应的驱动模型也不同。Linux下开发设备驱动程序要遵循内核模...

嵌入式Linux之字符设备驱动

嵌入式Linux之字符设备驱动本文档从Linux字符设备入手,描述一个字符设备在内核编译产生,进而在应用层被调用的过程。通过对字符设备的研究,一窥Linux设备驱动程序的工作机制。...
  • iemink
  • iemink
  • 2016年01月31日 15:31
  • 199

嵌入式Linux字符设备驱动LED驱动编写

嵌入式Linux字符设备驱动LED驱动编写嵌入式Linux字符设备驱动开发总结--LED驱动 作者:英贝得教育02就业班   杨广东   设备驱动程序是集成在内核中,处理硬件或操作硬件控...

【嵌入式Linux驱动开发】三、字符设备驱动(二)

1. open函数 int  open(struct  inode, );

07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键驱动程序

一、查询方式的按键驱动程序 查询方式的按键驱动程序,与LED驱动程序类似,我们来复习一下上节的写好的LED字符设备驱动程序,改写出查询方式的按键驱动程序。首先我们要搭出字符设备驱动程序的框架: #in...

07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-按键驱动程序之异步通知机制+原子操作+互斥信号量+阻塞与非阻塞+定时器去抖

一、异步通知机制 从按键的实现方式来说,可以分为以下几种方式 查询方式,极度耗费CPU资源中断方式,平时休眠,按键按下,唤醒休眠poll机制,不需要一直read,根据poll返回值来决定是否rea...

实验题目:实现嵌入式Linux系统下的字符设备驱动程序(报告)

实验题目:实现嵌入式Linux系统下的字符设备驱动程序 实验目的:了解Linux系统下的字符设备驱动的结构理解交叉编译的相关知识理解驱动和应用程序的通信方式 实验要求:要求动态生成设备号,并在测试程序...
  • xum2008
  • xum2008
  • 2011年07月04日 22:33
  • 2328

嵌入式Linux字符设备入门之--LED驱动详解

一、实验环境PC机:Redhat9.0  内核版本:Linux2.4开发板:FL2440     内核版本:Linux2.6      CPU:s3c2440二、实验步骤1、硬件连接。       F...

嵌入式Linux字符设备驱动程序的主要数据结构

1)struct cdev:在内核中代表一个字符设备驱动(char device,cdev),每一个字符设备驱动都有一个struct cdev结构体变量与之对应,记录该设备驱动的相关信息,主要包括设备...
  • zbatp
  • zbatp
  • 2012年10月27日 20:53
  • 868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式linux字符设备驱动
举报原因:
原因补充:

(最多只允许输入30个字)