初识字符设备驱动

本篇文章是鄙人对于学习字符设备驱动的总结。

首先介绍下字符设备驱动的编写步骤:

1.注册设备号,(分为静态注册和动态注册两种),主设备号标识设备对应驱动程序,Linux内核允许多个驱动程序共享主设备号,次设备号由内核使用,用于正确确定设备文件所指设备,比如我们又led0、led1等等设备,主设备号管led这个设备驱动程序,而次设备号则用来确定具体哪个led。

  静态:

int register_chrdev_region(dev_t first, unsigned int count, char *name);


first是要分配的设备编号范围起始值,通常不是必须的,count是连续设备编号个数,name为设备名称,在/proc/devices和sysfs中。register_chrdev_region函数在分配成功时返回0,失败时返回负错误码。

 动态:

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, ubsigned int count, char *name);


dev为用于输出的参数,成功完成调用后将保存已分配范围的第一个编号,firstminor是要使用的被请求的第一个次设备号,通常为0,至于其他两个参数与上面一样。

当然,在不使用设备号时应该释放它们:

void unregister_chrdev_region(dev_t first, unsigned int count);


2.字符设备的注册,注册cdev结构体,cdev结构表示字符设备。

在内核调用设备的操作之前,必须分配并注册cdev结构体。

struct cdev *my_cdev = cdev_alloc();
my_cdev->fops = &my_fops;


 初始化已分配到的结构:

void cdev_init(struct cdev *cdev, struct file_operations *fops);

最后注册该设备结构体:

int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

如果这个调用失败,返回负的错误码,这个调用必须在完全准备好处理设备上的操作后。


3.file_operations结构用来建立设备编号与驱动程序操作之间的连接,这里假设我们的设备是led:

struct file_operations led_fops = {
     .owner    =  THIS_MODULE,
     .llseek   =  led_llseek,
     .read     =  led_read,
     .write    =  led_write,
     .ioctl    =  led_ioctl,
     .open     =  led_open,
     .release  =  led_release,
};

这是声明采用了标准C的标记化结构初始化语法。

说明一下,因为鄙人失误,上述2与3的顺序应该换一下。因为先把cdev结构体嵌入到struct led_dev中,再调用cdev_init来执行初始化。


下篇文章将深究字符设备,并为LED驱动程序写上注释。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值