GPIO实验(1)——基于rk3308b-cc-plus开发板

文章介绍了如何在RK3308开发板上配置dts文件以使用GPIO,包括在dts文件中添加引脚配置,编写GPIO驱动程序,使用内核模块结构,以及设备树和平台驱动的注册。同时,文章提到了内核模块的加载和卸载函数,以及在probe函数中申请和设置GPIO的操作。最后,文章提到了Kconfig和Makefile在编译过程中的作用,并指出通过cat/sys/kernel/debug/gpio检查GPIO状态。

1.配置dts文件

添加引脚配置到开发板所使用的dts文件中

//我的路径为/home/xt/Desktop/proj/rk3308_linux_release_v1.5.0a_20221212/kernel/arch/arm64/boot/dts/rockchip/rk3308b-roc-cc-plus-amic_emmc.dts
	gpio_demo: gpio_demo {
   
   
	    status = "okay";
	    compatible = "firefly,rk3308-gpio";
	    firefly-gpio = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;          /* GPIO4_A6 */
	};

status让gpio引脚处于可使用状态。而compatible实现与设备节点的直接配对。接下来写的驱动程序就会通过compatible的内容来找所要使用的gpio引脚。最后的一行则是写了名称和对应的引脚编号及其状态。

2.编写调用该gpio的驱动程序

首先我们要进入该目录下/home/xt/Desktop/proj/rk3308_linux_release_v1.5.0a_20221212/kernel/drivers/gpio。然后创建一个c文件放这个驱动程序,名字叫什么都可以。我的就按照官方教程叫做gpio-firefly.c

2.1 补充知识——Linux内核模块程序结构

Linux内核的整体架构本就非常庞大,其包含的组件也非常多。而我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。

Linux提供了这样的机制,这种机制被称为模块(Module)。可使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中。

模块本身不被编译入内核映像,从而控制了内核的大小。模块一旦被加载,它就和内核中的其他部分完全一样。

#include <linux/init.h>
#include <linux/sched.h>
#include <linux/module.h>
 
MODULE_LICENSE("GPL");

/*模块加载函数:当使用insmod命令加载模块时,该函数会自动被执行,完成加载工作*/
static int __init example_init(void)
{
   
   
        printk(KERN_EMERG "example, init\n");
        return 0;
}
 
/*模块卸载函数:当使用rmmod命令卸载模块时……*/
static void __exit hello_exit(void)
{
   
   
        printk(KERN_EMERG "example, exit\n");
}

/*模块家在函数以module_init()的方式被指定*/
module_init(example_init);
module_exit(example_exit);

2.2 补充知识——驱动注册

新的linux内核开始使用设备树方式,注册的不是平台设备而是平台的驱动,平台驱动在注册时会自动匹配设备节点,匹配成功后会调用probe函数。这一行为,简化了设备驱动的开发,让内核驱动模型管理设备驱动。

简单理解就是,有了一个platform_driver的结构体,可以利用里面的所填写的信息(compatible)自动去dst找对应,完成注册


static int firefly_gpio_probe(struct platform_device *pdev){
   
   }

static struct of_device_id firefly_match_table[] = {
   
   
	{
   
    .compatible = "firefly,rk3308-gpio",},
	{
   
   },
};

static struct 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值