1. 今天学习了RK3288的dts文件结构,特地写了一个gpio驱动点亮led灯,在这里把步骤代码分享给大家。
  2. 首先我们要在kernel/driver/gpio下创建个文件,文件名随便。
    在这里插入图片描述
  3. 创建完之后我们要在当前路径下的Makefile文件添加声明(根据文件名添加)。
    在这里插入图片描述
    CONFIG_GPIO_RK8XX这个名字可以自己定,后面的.o文件一定要跟你创建的文件名一致。
  4. 当然这还不够,继续找到rockchip_defconfig配置文件添加声明。
    在这里插入图片描述
    注意:这里的CONFIG要与你上面定义要一致。
  5. 下面开始在刚刚创建的文件中写入gpio驱动代码(内容太多我就展示主要代码,要源码可以找我拿。Q:812417530)
static const struct of_device_id of_leds_match[] = {
        { .compatible = "firefly,led", },
        {},
};
//of_device_id 用于device和driver的match
//compatible 在.dts文件的每个设备,都有一个compatible属性,compatible属性用户驱动和设备的绑定。
static int led_probe(struct platform_device *pdev)
{
	int ret = -1;
   	 int gpio;
	enum of_gpio_flags flag;
	struct device_node *led_node = pdev->dev.of_node;
	//设备节点结构体
	
 
	gpio = of_get_named_gpio_flags(led_node, "led-work", 0, &flag);
	if (!gpio_is_valid(gpio)){
		printk("invalid led-work: %d\n",gpio);
		gpio_free(gpio);
		return -1;
	} 
    if (gpio_request(gpio, "led_work")) {
		printk("gpio %d request failed!\n",gpio);
		gpio_free(gpio);
        return ret;
	}
	gpio_direction_output(gpio, 1);
	return 0;
}
//of_get_named_gpio_flags 从设备树中读取 led-power 的 GPIO 配置编号和标志,gpio_is_valid 判断该 GPIO 编号是否有效。
//gpio_request 则申请占用该 GPIO。如果初始化过程出错,需要调用 gpio_free 来释放之前申请过且成功的 GPIO 。
//调用 gpio_direction_output 就可以设置输出高还是低电平,因为是 GPIO_ACTIVE_HIGH ,如果要灯亮,需要写入 1 。
  1. 在dts文件中添加驱动描述:
led222: led222{
			compatible = "firefly,led";
			led-work = <&gpio7 4 GPIO_ACTIVE_HIGH>;
			status = "okay";
}

led222:led222{}这两个参数我感觉就是个变量名可以自己随便定,名字不一样也可以。
我的RK3288dts文件是"rk3288-evb-android-rk808-edp.dts",路径:/kernel/arch/arm/boot/bts
更详细dts解析可以参考dts解析
8. 编译kernel.img,resource.img烧录到板子
kernel 编译:

cd kernel
make ARCH = arm rockchip_deconfig
make ARCH = arm rk3288-evb-android-rk808-edp.img -j12
  1. 编译完成后会在kernel路径下生成kernel.img,resource.img,用烧录工具烧录到板子观看效果即可(烧录工具可以找我拿。Q:812417530)
    在这里插入图片描述
  2. 观看效果,用adb命令查询gpio引脚高低电平
rk3288:/ # cat /sys/kernel/debug/gpio
cat /sys/kernel/debug/gpio
GPIOs 0-23, platform/pinctrl, gpio0:
 gpio-5   (                    |power               ) in  hi
 gpio-6   (                    |vcc_phy             ) out hi
 gpio-12  (                    |otg_drv_gpio        ) out lo
 gpio-14  (                    |vcc_host            ) out hi

GPIOs 24-55, platform/pinctrl, gpio1:

GPIOs 56-87, platform/pinctrl, gpio2:

GPIOs 88-119, platform/pinctrl, gpio3:

GPIOs 120-151, platform/pinctrl, gpio4:
 gpio-146 (                    |bt_default_wake     ) in  hi
 gpio-148 (                    |reset               ) out hi
 gpio-149 (                    |bt_default_reset    ) out lo
 gpio-151 (                    |bt_default_wake_host) in  hi

GPIOs 152-183, platform/pinctrl, gpio5:
 gpio-163 (                    |bt_default_rts      ) in  hi

GPIOs 184-215, platform/pinctrl, gpio6:

GPIOs 216-247, platform/pinctrl, gpio7:
 gpio-218 (                    |enable              ) out hi
 gpio-219 (                    |led_work            ) out hi 

在这里插入图片描述
10. 如果上述内容对你有帮助,麻烦点赞关注一下哦,谢谢!!!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐