概述
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;
安装教程
执行make
执行make install
使用说明
insmod virt_gpio.ko
insmod virt_gpio_dev.ko
在/sys/class/gpio目录下,即可看到我们创建的虚拟gpio控制器,然后即可向正常的访问gpio控制器一样,访问该虚拟gpio控制器。
在/sys/devices/platform/virt_gpio_dev/目录下可以查看虚拟gpio控制器的寄存器(主要包括文件vgpio_dir、vgpio_in、vgpio_out)
最后
以上就是糟糕大树为你收集整理的linux 虚拟gpio 通信,virt_gpio_controller的全部内容,希望文章能够帮你解决linux 虚拟gpio 通信,virt_gpio_controller所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复