泰山派GPIO子系统驱动---亮灯

本人linux驱动小白,文章基于B站up主 李Sir______ 视频内容记录,做笔记用。如有错误欢迎指正。本文将以开发板第40引脚GPIO3_B4作为LED灯珠的控制引脚,高电平灯亮,低电平灯灭。

杂话

linux内核中,芯片厂商已经把所有控制器的设备树编写好了。硬件层与子系统的API也都适配好无需使用者关心。我们编写驱动只需要将自己所需要的硬件资源与厂商定义好的设备树匹配,在驱动程序中调用相应子系统API函数即可写出一份自己的GPIO驱动程序。相比传统无官方库支持的单片机需操作寄存器来操作底层,程序可移植性大大提高。


内核子系统三层概念

user	逻辑代码

—————————————————————————————————————————————

			设备驱动层(今天的驱动在这一层)       通过各个子系统  完成对硬件的操作 并向上层提供接口                              驱动工程师
			______________________________________________________________________________
kernel
			核心层(内核维护者)      屏蔽底层细节          向上层提供接口  各类子系统api               内核工程师

			———————————————————————————————————————

			厂商驱动层(瑞芯微)   各个厂商针对不同硬件的操作  包括内存映射     						厂商

—————————————————————————————————————————————
HARDWARE

		motor  led  lcd ...

厂商的设备树文件

厂商已经把所有的控制器设备树信息都提供了,下面是与gpio相关的一些文件所在位置。

path:kenel\arch\arm64\boot\dts\rockchip\rk3568.dtsi
...
gpio3: gpio@fe760000 {
   //节点名
	compatible = "rockchip,gpio-bank"; //厂商名  设备名
	reg = <0x0 0xfe760000 0x0 0x100>; //地址  0x0 0xfe760000控制器地址   0x0 0x100地址范围
	interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;//中断
	clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>;//时钟

	gpio-controller;//标识
	#gpio-cells = <2>;//描述子节点个数
	gpio-ranges = <&pinctrl 0 96 32>; //引脚范围 &pinctrl 引用pinctrl节点 0    96 GPIO起始序号  32引脚范围
	interrupt-controller;
	#interrupt-cells = <2>;//描述子节点个数
};
...
//一些宏厂商也已经做出定义
path:kernel\include\dt-binding\pinctrl\rockchip.h
path:kernel\include\dt-binding\pinctrl\pinctrl-amd.h
path:kernel\include\dt-binding\gpio\gpio.h

gpio设备树书写规则

[names]-gpios=<控制器地址 引脚编号 高/低电平>;

设备树中添加我们的设备

仿照设备树中的节点,添加一个我们自己的节点,位置在根节点处

path:kenel\arch\arm64\boot\dts\tspi-rk3566-user-v10-linux.dts
..............
/ {
   
	model = "lckfb tspi V10 Board";
	compatible = "lckfb,tspi-v10", "rockchip,rk3566";
	//自己新建的led灯的设备树 
	image_led{
   
		compatible = "image,led";
		status = "okay";
		led_gpio=<&gpio3 RK_PB4 GPIO_ACTIVE_LOW>;
	};   
	rk_headset: rk-headset {
   
		compatible = "rockchip_headset";
		headset_gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>;
		pinctrl-names = .......
		.....

编译内核,将boot.img文件烧录到开发板

./build.sh kernel

查看添加的设备树节点是否存在

root@RK356X:/tmp# ls  /proc/device-tree
	...........
 iep@fdef0000                     serial@fe6c0000
 image_led                        serial@fe6d0000
 interrupt-controller@fd400000    sfc@fe300000
 ..........

GPIO相关的API

static inline int of_get_named_gpio(struct device_node *np, const char *propname, int index)
功能:获取gpio编号
参数:
		np 结构体指针
		propname 属性名
		index 编号
返回值:
		成功 返回gpio编号
		失败 返回错误码


static inline int gpio_request(unsigned gpio, const char *label)
功能:申请gpio
参数:
		gpio   GPIO编号
		label  标签 NULL
返回值:
		成功 返回0
		失败 返回错误码
static inline int gpio_direction_input(unsigned gpio)
功能:设置gpio为输入
参数:
		gpio   GPIO编号
返回值:
		成功 返回0
		失败 返回错误码


static inline int gpio_direction_output(unsigned gpio, int value)
功能:设置gpio为输出
参数:
		gpio   GPIO编号
		value  输出电平       1高电平     0是低电平
返回值:
		成功 返回0
		失败 返回错误码

static inline void gpio_set_value(unsigned int gpio, int value)
功能:设置gpio输出电平
参数:
		gpio   GPIO编号
		value  输出电平       1高电平     0是低电平
返回值:
		成功 返回0
		失败 返回错误码


static inline int gpio_get_value(unsigned int gpio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值