
一、杂项设备注册流程杂项字符设备主设备号固定10次设备号0~255 255表示内核自动分配次设备号1.1 杂项字符设备注册函数1int misc_register(struct miscdevice *misc)形参杂项核心结构体1.1struct miscdevice{ int minor;//次设备号 const char *name;//设备文件名 const struct file_operations *fops;//文件操作指针集 struct list_head list; struct device *parent; struct device *this_device; const struct attribute_group **groups; const char *nodename; umode_t mode; }minor:次设备号0~255 255自动分配name:设备文件名 位置在/dev name给应用抽象出来的硬件文件fops文件操作指针集 -------给应用层留的接口1.1.3fops操作指针集 struct file_operations { struct module *owner; // THIS_MODULE 表示接口属于当前模块【必须填写】 //下面函数接口根据硬件需要填写 loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); int (*iopoll)(struct kiocb *kiocb, bool spin); int (*iterate) (struct file *, struct dir_context *); int (*iterate_shared) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); unsigned long mmap_supported_flags; int (*open) (struct inode *, struct file *); int (*flush) (struct file *, fl_owner_t id); ...... };返回值成功返回0失败返回负数1.2 杂项字符设备函数2void misc_deregister(struct miscdevice *misc)这个函数和1.1一样只不过函数不一样而已使用方法一致二、GPIO子系统开发流程Linux GPIO通用输入输出子系统是一个驱动框架用于管理和控制设备的 GPIO 引脚1、请求GPIOint gpio_request(unsigned gpio, const char *label)形参gpio 编号 瑞芯微引脚命名 GPIOX_YZ 编号计算X*32Y*8ZX从 0 开始 一组 32 个引脚Y从 A 开始 一组 8 个引脚Z从 0 开始 每一个小组中引脚编号例如: beep GPIO1_A432*10*8436label: 引脚命名2、配置 gpio 模式2.1配置为输出模式int gpio_direction_output(unsigned gpio, int value)形参: gpio: 引脚编号 value: 引脚初始值2.2配置为输入模式int gpio_direction_input(unsigned gpio)3、设置 GPIO 口值void gpio_set_value(unsigned gpio, int value)参数 gpio: 引脚编号 value: 给 io 的值4释放 GPIOvoid gpio_free(unsigned gpio)