# virt_gpio_controller **Repository Path**: caobinxin/virt_gpio_controller ## Basic Information - **Project Name**: virt_gpio_controller - **Description**: 基于linux gpio子系统提供的接口,实现一个虚拟的gpio controller驱动,用于说明gpio controller驱动的开发流程。 - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2022-11-27 - **Last Updated**: 2022-11-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # virt_gpio_controller #### 介绍 基于linux gpio子系统提供的接口,实现一个虚拟的gpio controller驱动,用于说明gpio controller驱动的开发流程。 #### 软件架构 说明如何实现一个虚拟的gpio控制器驱动,从而让我们熟悉gpio控制器驱动的开发流程, 让我们在没有开发板的情况下,也可以很好的学习linux gpio子系统驱动。 虚拟gpio控制器说明 虽然是一个虚拟的gpio控制器,但我们还是说明该虚拟gpio控制器的相关参数。针对该虚拟gpio控 制器,主要提供4个寄存器,这四个寄存器的定义如下: 0x00:gpio方向寄存器,用于进行gpio的方向配置,每一位代表一个gpio,1表示输入;0表示输出; 0x08:gpio输入寄存器,用于存储输入方向的gpio的值,该寄存器为只读寄存器; 0x10:gpio输出寄存器,主要用于对配置为输出的gpio值的获取,1表示输出高电平;0表示输出低电平; 0x18:表示中断配置寄存器,主要针对gpio中断使能与关闭,1表示使能中断;0表示关闭中断; 0x20:表示中断状态寄存器,主要用于说明是否产生中断,1表示中断产生;0表示未产生中断,该寄存器只读,且值为读清零。 (本次我们实现的gpio,不涉及gpio中断部分的内容,因中断涉及irq_chip,此处先不实现gpio中断的内容); 虚拟gpio控制器驱动涉及的内容说明 本次驱动开发主要涉及如下两部分的内容: 1. 实现一个platform device,用于传递虚拟gpio控制器的信息,包括gpio base index、gpio num等 2. 实现一个platform driver,该drvier实现的功能如下: 1. platform driver主要用于与上述platform device完成绑定,并根据platform dev提供的控制器参数,填充struct gpio_chip类型变量,并调用gpiochip_add完成gpio_chip的注册; 2. 为该platform device在/sys下创建3个属性文件,分别为vgpio_dir(模拟gpio方向寄存器,查看该虚拟gpio控制器的方向配置参数,该属性设置为只读,仅可通过gpio_chip提供的属性文件进行方向配置)、vgpio_in(模拟gpio输入寄存器,该属性为读写,我们可通过修改vgpio_in的值,模拟输入值,用以供虚拟gpio_chip进行查看)、vgpio_out(模拟gpio输出寄存器,该属性为只读)。 虚拟gpio控制器驱动相关的数据结构说明 本次驱动主要涉及两个数据结构:virt_gpio_plat_data_t、virt_gpio_chip_t virt_gpio_plat_data_t用于platform_device与platform_driver之间传递虚拟gpio控制器的参数,因为 我们此次开发的虚拟gpio驱动未使用设备树配置虚拟gpio控制器参数,因此只能借virt_gpio_plat_data_t传递参数,另外当我们使用设备树配置虚拟gpio控制器参数时,可不设gpio base index的值,由系统进行分配;而我们不使用设备树配置虚拟gpio控制器参数时,则建议还是指定gpio base index吧。 typedef struct virt_gpio_plat_data_s { int base_gpio; int gpio_num; }virt_gpio_plat_data_t; virt_gpio_chip_t为本次虚拟gpio控制器相关的私有变量,包括了该虚拟gpio控制器对应的参数,因我 们是虚拟gpio控制器,因此我们定义了gpio_dir、gpio_in、gpio_out、gpio_irq模拟四个寄存器,若是真实的gpio控制器,则只需要获取gpio控制器的寄存器地址即可。 typedef struct virt_gpio_chip_s { struct gpio_chip chip; spinlock_t reg_lock; uint64_t gpio_dir; uint64_t gpio_in; uint64_t gpio_out; uint64_t gpio_irq; /*此处不需要该变量,因为我们是模拟的*/ // void __iomem *reg_base; }virt_gpio_chip_t; #### 安装教程 1. 执行make 2. 执行make install #### 使用说明 1. insmod virt_gpio.ko 2. insmod virt_gpio_dev.ko 3. 在/sys/class/gpio目录下,即可看到我们创建的虚拟gpio控制器,然后即可向正常的访问gpio控制器一样,访问该虚拟gpio控制器。 4. 在/sys/devices/platform/virt_gpio_dev/目录下可以查看虚拟gpio控制器的寄存器(主要包括文件vgpio_dir、vgpio_in、vgpio_out)