1. 字符设备结构体 内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里.该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static struct char_device_struct {        struct char_device_struct *next;    // 指向散列冲突链表中的下一个元素的指针        unsigned int major;                 // 主设备号       …
1. 字符设备结构体 内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里.该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static struct char_device_struct {       struct char_device_struct *next;    // 指向散列冲突链表中的下一个元素的指针       unsigned int major;                 // 主设备号       un…
一.Linux设备分类 Linux系统为了管理方便,将设备分成三种基本类型: 字符设备 块设备 网络设备 字符设备: 字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性.字符设备驱动程序通常至少要实现open.close.read和write的系统调用. 字符终端(/dev/console)和串口(/dev/ttyS0以及类似设备)就是两个字符设备,它们能很好的说明“流”这种抽象概念. 字符设备可以通过文件节点来访问,比如/dev/tty1和/de…
1.查看用户手册 led1.led2.led3.led4 连接的分别是 GPK4.GPK5.GPK6.GPK7 2.查询6410芯片手册 下面还需要3个步骤: 1.设置GPIO为OUTPUT. 将GPK4.GPK5.GPK6.GPK7设置为输出output=0001 即GPKCON0的19:28都配置为0001 2.设置GPIO的数据. 将GPKDATA的4:7位赋值为0 3.设置GPKUP为上拉. 将GPKUP的4:7位设置为10 3.代码 led_driver.c #include <lin…
(1) 分配设备编号,注册设备与注销设备的函数均在fs.h中声明,如下: extern int register_chrdev_region(dev_t,unsigned int,const char*);表示静态的申请和注册设备号 extern int alloc_chrdev_region(dev_t,unsigned int,const char*);表示动态的申请和注册设备号 extern int register_chrdev(unsigned int,const char*,stru…
内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1)register_chrdev  比较老的内核注册的形式   早期的驱动(2)register_chrdev_region/alloc_chrdev_region + cdev  新的驱动形式 区别:register_chrdev()函数是老版本里面的设备号注册函数,可以实现静态和动态注册两种方法…
之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个file_operations结构体,应用程序使用的也都是这一个结构体中注册的函数.这就会出现这样的一个弊端:同一类字符设备(即主设备号相同),会在内核中连续注册了256(分析内核代码中可知),也就是所以的此设备号都会被占用,而在大多数情况下都不会用到这么多次设备号,所以会造成极大的资源浪费.所以reg…
1.之前注册字符设备用的如下函数注册字符设备驱动: register_chrdev(unsigned int major, const char *name,const struct file_operations *fops); 但其实这个函数是linux版本2.4之前的注册方式,它的原理是: (1)确定一个主设备号 (2)构造一个file_operations结构体, 然后放在chrdevs数组中 (3)注册:register_chrdev 然后当读写字符设备的时候,就会根据主设备号从chr…
首先我们在注册函数里面调用了register_chrdev(MEM_MAJOR,"mem",&memory_fops),向内核注册了一个字符设备. 第一个参数是主设备号,0代表动态分配,这里的MEM_MAJOR是1.第二个参数是设备的名字,第三个参数是文件操作指针. 每个设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使用的驱动程序:另一个是次设备号,标识使用同一设备驱动程序的不同硬件设备.设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设…
1.2.2  使用register_chrdev注册字符设备 注册字符设备可以使用register_chrdev函数. int register_chrdev (unsigned int major, const  char *name, struct file_operations*fops); register_chrdev函数的major参数如果等于0,则表示采用系统动态分配的主设备号. 注销字符设备可以使用unregister_chrdev函数. int unregister_chrde…