时间:2023-01-13 10:42
人气:
作者:admin
一、概述
SemiDrive X9H 拥有不同的 domain 域,例如 AP,Safety,Secure 等等。对于 GPIO 资源,不同 domain 之间 gpio 控制器是不同的,本次主要是使用的 AP 使用的是 gpio4 控制器。除了GPIO 控制器在不同 domain 之间不同以外,pin 也是有各自不同的 domain 的,但是当它作为 gpio 使用时,可以通过设置挂靠到对应域下的 gpio 控制器上来在对应 domain 下使用。具体 pin 的 gpio 控制器的设置是通过 PC 工具 SDConfigTool 来进行。
本文主要是讲述将 pin 作为 GPIO 使用,之后编写字符设备驱动,测试。
二、适用环境
硬件:SemiDrive SD003_X9H REF_A03 DEMO Board
软件:X9 PTG3.9
三、设备树匹配
1、复用管脚为 GPIO
路径:
/buildsystem/yocto/source/linux/arch/arm64/boot/dts/semidrive/x9_high_ref_native_serdes_nobt.dts
在上面 dts 文件的 &pinctrl 的 sdx9-evk 中添加管脚复用,主要是将 GPIO_C1 管脚复用成 GPIO。
pinctrl_gpio_learning: gpiogrp_learning {
kunlun,pins = <
X9_PINCTRL_GPIO_C1__GPIO_MUX2_IO1_1 0x00
>;
};
2、配置一个新节点
路径:
/buildsystem/yocto/source/linux/arch/arm64/boot/dts/semidrive/x9_high_ref_native_serdes_nobt.dts
在上面 dts 文件里面的根节点 / 下新建一个节点,添加属性,获取 gpio 编号。
gpio_learning {
#address-cells = <1>;
#size-cells = <1>;
compatible = "gpioled_learning";
pinctrl-0 = <&pinctrl_gpio_learning>;
gpio = <&port4b 17 GPIO_ACTIVE_HIGH>;
status = "okay";
};
四、驱动编写
1、模块出/入口函数
其中 module_init 是驱动入口函数,主要进行 platform 平台驱动注册,module_exit 是驱动出口函数,主要是进行 platform 平台驱动注销;
其中 MODULE_LICENSE 主要是声明模块许可证,一般为 GPL。
/*设备入口函数*/
static int __init gpio_learning_init(void)
{
return platform_driver_register(&gpio_learning_driver);
}
/*设备出口函数*/
static void __exit gpio_learning_exit(void)
{
platform_driver_unregister(&gpio_learning_driver);
}
/*指定上面的入口和出口函数*/
module_init(gpio_learning_init);
module_exit(gpio_learning_exit);
MODULE_LICENSE("GPL"); //LICENSE 采用 GPL 协议
2、platform 平台驱动结构体
主要是通过 match 函数和对应的设备树里面节点匹配,只要 compatible 属性匹配成功即可,匹配成功就执行 probe 函数。
/*匹配列表*/
static const struct of_device_id gpio_learning_of_match[] = {
{ .compatible = "gpioled_learning" },
{ /*sentinel*