gpio子系统

1、什么是gpio子系统

用于处理和管理 通用输入输出引脚(GPIO),在内核里面主要是3个结构体来支持gpio子系统,分别是gpio_chip,gpio_desc,gpio_device。

gpio_chip主要是用来做具体的硬件实施的,我们主要是用它来对寄存器的操控,

gpio_desc主要是用来描述一个引脚的信息,也由linux内核解析设备树的时候自动生成

gpio_device由Linux内核在解析到gpio控制器的时候自动生成。

我们要做的是需要自己实现gpio_chip的结构体,操控对应的硬件寄存器。

实现一个gpio_chip的重要的函数

c 复制代码
int devm_gpiochip_add_data(struct device *dev, struct gpio_chip *gc, void *data);
dev:设备结构体,用于资源管理和设备生命周期关联。
gc:GPIO 控制器的 gpio_chip 结构体,定义 GPIO 控制的操作接口。
data:用户数据指针,用于传递额外的上下文信息到操作函数中。

将 GPIO 控制器 (gpio_chip) 和设备 (pdev->dev) 关联起来,并将它注册到内核的 GPIO 框架中。

c 复制代码
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/mutex.h>
#include <linux/mod_devicetable.h>
#include <linux/bitops.h>
#include <linux/jiffies.h>
#include <linux/property.h>
#include <linux/acpi.h>
#include <linux/i2c.h>
#include <linux/nvmem-provider.h>
#include <linux/regmap.h>
#include <linux/pm_runtime.h>
#include <linux/gpio/consumer.h>
#include<linux/input.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/slab.h>
#include<linux/device.h>



static struct gpio_chip *g_virt_gpio;

static int g_gpio_val = 0;



static int virt_gpio_direction_output(struct gpio_chip *gc,
		unsigned offset, int val)
{
	printk("set pin %d as output %s\n", offset, val ? "high" : "low");
	return 0;
}

static int virt_gpio_direction_input(struct gpio_chip *chip,
					unsigned offset)
{
	printk("set pin %d as input\n", offset);
	return 0;
}


static int virt_gpio_get_value(struct gpio_chip *gc, unsigned offset)
{
	int val;
	val = (g_gpio_val & (1<<offset)) ? 1 : 0;
	printk("get pin %d, it's val = %d\n", offset, val);
	return val;
}

static void virt_gpio_set_value(struct gpio_chip *gc,
		unsigned offset, int val)
{
	printk("set pin %d as %d\n", offset, val);
	if (val)
		g_gpio_val |= (1 << offset);
	else
		g_gpio_val &= ~(1 << offset);
}


static int gpiochip_drv_probe(struct platform_device *pdev)
{
	printk("%s , %s ,%d \n",__FUNCTION__,__FILE__,__LINE__);


	g_virt_gpio=devm_kzalloc(&pdev->dev, sizeof(*g_virt_gpio), GFP_KERNEL);



	/*配置gpio*/
	g_virt_gpio->label=pdev->name;
	g_virt_gpio->direction_input=virt_gpio_direction_input;
	g_virt_gpio->direction_output=virt_gpio_direction_output;
	g_virt_gpio->set=virt_gpio_set;
	g_virt_gpio->get=virt_gpio_get;
	g_virt_gpio->parent=&pdev->dev;
	g_virt_gpio->owner=THIS_MODULE;
	g_virt_gpio->base=-1;
	ret=of_property_read_u32(pdev->dev.of_node, "ngpios", &val);
	g_virt_gpio->ngpio=val;
	ret = devm_gpiochip_add_data(&pdev->dev, g_virt_gpio, NULL);
	
	return 0;
}
static int gpiochip_drv_remove(struct platform_device *pdev)
{
	printk("%s , %s ,%d \n",__FUNCTION__,__FILE__,__LINE__);
	return 0;
}
const struct of_device_id	gpiochip_drv_table[]=
{
	{.compatible="vir,virtual_gpio"},
	{/*end list*/},

};






static struct platform_driver gpiochip_drv=
{
	.probe=gpiochip_drv_probe,
	.remove=gpiochip_drv_remove,
	.driver={
			.name="vir,gpiochip_drv",
			.of_match_table=gpiochip_drv_table,
	},

};



static int __init gpiochip_drv_init(void)
{

	printk("%s , %s ,%d \n",__FUNCTION__,__FILE__,__LINE__);
	return platform_driver_register(&gpiochip_drv);;
}

static void __exit gpiochip_drv_exit(void)
{
	printk("%s , %s ,%d \n",__FUNCTION__,__FILE__,__LINE__);
	platform_driver_unregister(&gpiochip_drv);	
}


module_init(gpiochip_drv_init);
module_exit(gpiochip_drv_exit);
MODULE_LICENSE("GPL");

上面是gpio子系统框架的gpio_chip,主要实现这个结构体,用的是platform_device总线设备模型。

相关推荐
FLJwu11 小时前
运动相机图像传感器选型实战|第二篇:参数看着一模一样,为什么骑行录像疯狂果冻、拖影翻车?
android·c语言·开发语言·数码相机·运动相机·oem 量产
Escalating_xu11 小时前
【C语言项目实战】贪吃蛇(下):移动、碰撞与计分,完成一局可玩的游戏
c语言·开发语言·游戏
C++ 老炮儿的技术栈12 小时前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
lhbweilai1 天前
分析FreeRTOS内核对象API的源码实现(八)
c语言·开发语言·stm32·单片机
艾络迅Acceleronix1 天前
环境监测终端:STM32+EG800Z AT+ 艾络迅平台实战|多传感器采集联动全流程
c语言·stm32·单片机·嵌入式硬件·物联网·1024程序员节
Zwawa1 天前
一只按键不只“按下”:短按、长按和连按如何共存
c语言·单片机·嵌入式
wyhwust1 天前
程序设计基础--C语言输入输出单元测试
c语言·开发语言
another heaven1 天前
【C/C++ C++ 面向对象架构的五大特点与能力场景:封装、继承、多态、抽象与 RAII(含实战案例)】
c语言·c++·架构
晓蛋1 天前
什么是C语言
c语言·跨平台·编程语言·高级语言·低级语言
知识分享小能手1 天前
C学习教程,从入门到精通,C语言单片机基础 — 完整知识点手册(19)
c语言·单片机·学习