首页 > 其他分享 >0730_驱动1 gpio子系统

0730_驱动1 gpio子系统

时间:2024-07-31 19:00:43浏览次数:8  
标签:linux 控制器 0730 int 编号 gpioe gpio 子系统

一、介绍gpio子系统

1.1基于gpio子系统框架

1.2基于gpio子系统API接口

#include <linux/of_gpio.h>
int of_get_named_gpio(struct device_node *np,
                                   const char *propname, int index)
函数功能:获取gpio编号
参数:
    np:节点结构体指针
    propname:属性名字
    index:索引号
返回值:
    成功获取到的gpio编号
    失败返回<0

#include <linux/gpio.h>  
int gpio_request(unsigned gpio, const char *label);    
函数功能:申请gpio编号
参数:
    gpio:获取到的gpio编号
    label:NULL
返回值:
    成功返回0
    失败返回-1

int gpio_direction_input(unsigned gpio)    
函数功能:设置gpio编号为输入模式
参数:
    gpio:获取到的gpio编号
返回值:
    成功返回0
    失败返回-1
    
int gpio_get_value(unsigned int gpio)
函数功能:读取gpio编号的值
参数:
    gpio:获取到的gpio编号
返回值:
    返回值0:表示低电平
    返回值1:表示高电平
        
int gpio_direction_output(unsigned gpio, int value)
void gpio_set_value(unsigned int gpio, int value)
函数功能:设置gpio编号输出高低电平
参数:
    gpio:获取到的gpio编号
    value:
        写0:输出低电平
        写1:输出高电平
返回值:
    成功返回0
    失败返回-1
            
void gpio_free(unsigned gpio);
函数功能:释放gpio编号
参数:
   gpio:申请的gpio编号 
返回值:无

二、分析gpio子系统设备树

2.1引脚编号

2.2编写思路 

  1. 通过以上框图分析可知三盏灯对应的引脚编号
  2. led1/led3与GPIOE控制器连接
  3. led2与GPIOF控制器连接
  4. 在linux内核中,所有的控制器已经编写实现
  5. 所以对于驱动工程师,只需要引用对应的控制器

2.3分析设备树 

1、进入设备树目录,打开设备树源文件,搜索gpioe控制器
    linux@ubuntu:~/linux-5.10.61$ cd arch/arm/boot/dts/
    linux@ubuntu:~/linux-5.10.61/arch/arm/boot/dts$ vi stm32mp157a-fsmp1a.dts 
    linux@ubuntu:~/linux-5.10.61/arch/arm/boot/dts$ vi stm32mp157.dtsi
    linux@ubuntu:~/linux-5.10.61/arch/arm/boot/dts$ vi stm32mp153.dtsi
    linux@ubuntu:~/linux-5.10.61/arch/arm/boot/dts$ vi stm32mp151.dtsi
2、打开stm32mp151.dtsi, 搜索gpioe控制器,出现如下节点,分析gpioe节点   
    #address-cells = <1>;
    #size-cells = <1>;
    解释:address-cells和size-cells修饰子节点中固定含义键reg
    address-cells:表示地址个数
    size-cells:表示长度个数

    gpioe: gpio@50006000 {  =======> 将gpio@50006000起别名为gpioe                                                                              
        gpio-controller; =======> 空属性,没有实际含义,只起到标识作用
        #gpio-cells = <2>;  =======> 子节点在引用gpioe控制器时,需要填充2个成员


        reg = <0x50006000 0x400>; =======> reg是固定含义键
        clocks = <&rcc GPIOE>; =======> GPIOE组时钟使能

        status = "disabled"; =======> GPIOE组控制器状态禁止
    };
3、打开stm32mp15xxac-pinctrl.dtsi, 搜索gpioe控制器,出现如下节点,分析gpioe节点      
    linux@ubuntu:~/linux-5.10.61/arch/arm/boot/dts$ vi stm32mp15xxac-pinctrl.dtsi
        gpioe: gpio@50006000 { =======> 将gpio@50006000起别名为gpioe                                                                                           
            status = "okay"; =======> GPIOE组控制器状态使能
            ngpios = <16>; =======> gpio每组有16个引脚
            gpio-ranges = <&pinctrl 0 64 16>; =======> gpioe组引脚编号范围
        };     
4、通过以上分析,引用gpioe和gpiof组控制器 &gpioe &gpiof        

三、编写gpio子系统设备树

3.1参考内核帮助文档

3.2编写gpio子系统设备树步骤

  1. 进入设备树目录,打开设备树源文件
  2. 添加gpio子系统设备树节点信息
  3. 编译设备树,并且拷贝到~/tftpboot目录下
  4. 开发板一定重新上电!!!!!!!!!
  5. 打开串口工具,开发板重新上电,加载最新设备树

四、gpio子系统练习

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>

/*
myled{//基于gpio子系统设备树
    led1 = <&gpioe 10 0>; //led1 PE10
    led2 = <&gpiof 10 0>; //led2 PF10
    led3 = <&gpioe 8 0>; //led3 PE8
}; 
*/
struct device_node* node;
unsigned int gpionum;
static int __init demo_init(void)
{
    //获取myled节点
    node = of_find_node_by_path("/myled");
    if(node == NULL){
        printk("of find node by path is error\n");
        return -EIO;
    }
    //获取gpio编号
    gpionum = of_get_named_gpio(node,"led1",0);
    if(gpionum < 0){
        printk("of get named gpio is error\n");
        return -EIO;
    }
    //申请gpio编号
    gpio_request(gpionum,NULL);
    //设置gpio引脚输出高电平
    gpio_direction_output(gpionum,1);
    return 0;
}

static void __exit demo_exit(void)
{
    //设置gpio引脚输出低电平
    gpio_direction_output(gpionum,0);
    //释放gpio编号
    gpio_free(gpionum);
}

module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

 

标签:linux,控制器,0730,int,编号,gpioe,gpio,子系统
From: https://blog.csdn.net/slander_1120/article/details/140830063

相关文章

  • win10下WSL2子系统与winnfsd使用
    1安装WSL2子系统1.1下载安装进入windowsStore,搜索Ubuntu,下载:1.2开启依赖右键windows左下角->应用和功能->相关设置-程序和功能->启用或关闭windows功能。勾选适用于Linux的windows子系统和虚拟机平台(WSL2需要)选项:也可以直接在powershell中输入如下两条指令开启:dism......
  • Leetcode每日一题 20240730 2961.双模幂运算
    题目描述给你一个下标从0开始的二维数组variables,其中variables[i]=[ai,bi,ci,mi],以及一个整数target。如果满足以下公式,则下标i是好下标:0<=i<variables.length((aibi%10)ci)%mi==target返回一个由好下标组成的数组,顺序不限。2961.双模幂......
  • 【调试笔记-20240730-Linux-OpenWrt 23.05 安装 Docker 配置 bitnami/Wordpress-with-
    调试笔记-系列文章目录调试笔记-20240730-Linux-OpenWrt23.05安装Docker配置bitnami/Wordpress-with-NGINX实现微信用户在线注册登录文章目录调试笔记-系列文章目录调试笔记-20240730-Linux-OpenWrt23.05安装Docker配置bitnami/Wordpress-with-NGINX实现......
  • 探索Cinema 4D粒子系统与Arnold
    ​Cinema4D结合Arnold是艺术家和工作室在许多领域经常使用的最著名的3D软件和渲染引擎之一,因为它的便利性和多功能性。在Cinema4D2024.4中,我们看到了粒子系统的发布,它可以帮助您在Arnold中生成粒子。工作流程粒子组默认情况下,您需要渲染场景中的所有粒子组,它们以球体的形式......
  • 盖世计划--0730--B班训练
    A哈哈,写过的题,看过的性质还能忘,这辈子有了。一个性质,如果要将\(A\)序列通过相邻位置\(+1\)或\(-1\)操作(总和不变,相当于传递)变为序列\(B\),设\(sa_i=\sum\limits_{j=1}^ia_j\),\(sb_i=\sum\limits_{j=1}^ia_j\)。那么最少操作次数为:\[\sum_{i=1}^n|sa_i-sb_i|\]理解一下......
  • GPIO简介
    目录GPIO简介GPIO主要特性GPIO功能描述I/O端口位的基本结构以下是基于STM32F4xx中文参考手册进一步的手册内容分析,作为自身学习过程的记录。如您是初学者并且对手册描述的内容感到一知半解,您可以参考以下部分内容并结合您自身的见解加深对相关内容的理解。若是大佬们看到内容有......
  • 2. GPIO读写
    GPIO简介GPIO(全称为GeneralPurposeInput/Output),即通用输入/输出,可以认为GPIO是片外外设与片内的通信接口,通过控制GPIO的电平状态,可以实现片外外设与片内的通信以及数据的输入输出。对于st32F103系列的GPIO,其命名规则为GPIO+端口号,如GPIOA,GPIOB。对于每个端口又有着16个引......
  • 关于GPIO输出模式下3种频率的解释
    配置GPIO输出模式时,有3种频率可以选择:2MHz、10MHz和50MHz,如下图:此处频率指的是I/O口驱动电路的响应频率而不是输出信号的频率。芯片的内部做了多个响应频率不同的输出驱动电路,可以根据需要选择合适的驱动电路。通过选取不同频率的输出驱动电路达到最佳的控制噪声和降低功耗的效......
  • 【linux】【设备树】具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解
    具有GPIO控制器和连接器的硬件配置的备树(DeviceTree)代码讲解背景-学习Linux设备树代码soc{soc_gpio1:gpio-controller1{#gpio-cells=<2>;};soc_gpio2:gpio-controller2{#gpio-cells=<2>;};};connector:connect......
  • Android低功耗子系统的投票机制以及触发进入系统休眠的过程
    从kernel角度看,系统是否进入休眠应该由内核来控制,因此Linux引入了wakeupsource以及autosleep机制关于wakeupsource的介绍,请参考:WakeupSource框架设计与实现关于autosleep机制,请参考:autosleep框架设计与实现在内核中,使用wakeupsource提供投票机制,让各个系统模块投票......