我是靠谱客的博主 糟糕大树,最近开发中收集的这篇文章主要介绍linux 虚拟gpio 通信,virt_gpio_controller,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部