论 SoC上的Linux如何拉动外部I/O

news2024/11/28 12:38:20

在MCU中(如classic autosr或其他RTOS),一般可以直接通过往对应的寄存器(地址转为指针)写值,
或者调用一些硬件抽象层或者驱动接口来拉动芯片提供的GPIO。
但是在Linux中,可能不会让应用层直接去访问底层的物理地址,而且配置GPIO或者其他什么IO,往往不只一个寄存器,可能是一组,比较复杂。

SoC中嵌入式Linux控制I/O需要关注的问题

SoC相较于单片机或者MCU,往往复杂得多。读芯片手册和电路板原理图的时候,需要关注很多问题,

I/O种类

目前我看到的I/O有两种,一种是SoC芯片直接提供的GPIO. 一种是通过i2c总线,挂一些I/O扩展器,来实现的外部I/O。
对于SoC板而言,可能这两种同时存在。但是他们的控制方法是不同的。

当使用了总线 I/O扩展芯片来实现外部 I/O, 那么还需要获取和阅读对应扩展芯片的手册。

设备树

需要查阅、核对、修正设备树的能力。
SoC内部的配置和体系各家各自成一套,所以才有设备树。设备树和开发板不配套,可能会造成很多问题,比如/dev下面东西不对。地址不对等等。
另外,要是内核裁剪的有问题,比如一些驱动或者文件系统没有放进来,就更麻烦了,要重新编译内核和内核模块。

GPIO

需要先确认我们需要使用的GPIO芯片,以及该端口位于该GPIO芯片的编号。

然后可以使用gpio文件系统去配置和控制对应的IO。

这里可能需要使用设备树文件来识别控制芯片和偏移。
偏移请参阅SOC的芯片手册。

下面都以TDA4论坛上的问答为例:
[FAQ] TDA4VM/DRA829/AM65xx: Linux: Configuring GPIOs

查询gpio控制芯片和设备树信息:

root@j7-evm:~# find /proc/device-tree/__symbols__/ | grep gpio
/proc/device-tree/__symbols__/main_gpio_intr
/proc/device-tree/__symbols__/main_gpio7
/proc/device-tree/__symbols__/main_gpio5
/proc/device-tree/__symbols__/wkup_gpio0
/proc/device-tree/__symbols__/main_gpio3
/proc/device-tree/__symbols__/main_gpio1
/proc/device-tree/__symbols__/gpio_keys
/proc/device-tree/__symbols__/wkup_gpio_intr
/proc/device-tree/__symbols__/main_gpio6
/proc/device-tree/__symbols__/wkup_gpio1
/proc/device-tree/__symbols__/main_gpio4
/proc/device-tree/__symbols__/main_gpio2
/proc/device-tree/__symbols__/main_gpio0


root@j7-evm:~# cat /proc/device-tree/__symbols__/main_gpio0
/interconnect@100000/gpio@600000

然后对应地址来找驱动文件系统:


root@j7-evm:~# ls -la /sys/class/gpio/


lrwxrwxrwx 1 root root 0 Feb 17 08:38 gpiochip84 -> ../../devices/platform/interconnect@100000/600000.gpio/gpio/gpiochip84

根据对应的地址我们发现,控制芯片是84

如果我们要控制gpio0_127。
就得到:84+127=211.

然后:

root@j7-evm:~# cd /sys/class/gpio/
root@j7-evm:/sys/class/gpio# echo 211 > export
root@j7-evm:/sys/class/gpio# cd gpio211
root@j7-evm:/sys/class/gpio/gpio211# echo out > direction
root@j7-evm:/sys/class/gpio/gpio100# echo 1 > value

Above should export the GPIO and you can do read/writes.

I2C扩展I/O

参考:
TDA4VMXEVM: USER_LED1 & USER_LED2 through I2C GPIO EXPANDER2 (TCA6424ARGJR) - Processors forum - Processors - TI E2E support forums

以TDA4通用开发板为例:

在这里插入图片描述

开发板原理图中包含GPIO扩展MAP表。
查表可知I2C0 总线,0x22芯片地址的P26 P27有两个灯(I/O)可以被用户使用。

在这里插入图片描述

从图中可知,这是一个IO扩展芯片,和SOC之间通过I2C扩展。

这里写了地址0x22。和芯片型号。

查询对应型号的芯片手册,

8.6.2 Register Descriptions

在这里插入图片描述

从datasheet中可知,寄存器0 1 2三个字节,表示各个io的读取结果。

4 5 6是配置输出内容的地方。

8 9 10,配置极性反转。目前用不到。

12 13 14,配置I/O的方向。1 是输入,0 是输出。

那我们需要点亮LED P26 P27。

就如下操作:

查看i2c地址和对应的总线号。


root@j7-evm:~# dmesg | grep i2c
[    1.082853] i2c /dev entries driver
[    1.235041] omap_i2c 40b00000.i2c: bus 0 rev0.12 at 100 kHz
[    1.235521] omap_i2c 40b10000.i2c: bus 1 rev0.12 at 100 kHz
[    1.239971] omap_i2c 42120000.i2c: bus 2 rev0.12 at 100 kHz
[    1.265639] omap_i2c 2000000.i2c: bus 3 rev0.12 at 400 kHz
[    1.266549] omap_i2c 2010000.i2c: bus 4 rev0.12 at 400 kHz
[    1.267005] omap_i2c 2020000.i2c: bus 5 rev0.12 at 100 kHz
[    1.292154] omap_i2c 2030000.i2c: bus 6 rev0.12 at 400 kHz
[    1.295636] omap_i2c 2040000.i2c: bus 7 rev0.12 at 100 kHz
[    1.296040] omap_i2c 2050000.i2c: bus 8 rev0.12 at 100 kHz
[    1.319763] omap_i2c 2060000.i2c: bus 9 rev0.12 at 400 kHz

root@j7-evm:/proc/device-tree/__symbols__# cat main_i2c0
/bus@100000/i2c@2000000

可知i2c0 的总线号是 3.

后面使用i2c 工具来操作扩展芯片的寄存器:

#查看设备
root@j7-evm:~# i2cdetect -y -r  3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: UU -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- 6d -- -- 
70: 70 71 -- -- -- -- 76 -- 

#UU似乎表示这里0x20 0x22是两个内核没有使用的设备,和手册里的i2c芯片地址对应了

# 读取当前寄存器内容
root@j7-evm:~# i2cdump -f -y 3 0x22 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 0c 84 f1 XX 3f fd ff XX 00 00 00 XX 3b f9 ef XX    ???X??.X...X;??X
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: 0c 84 f1 XX 3f fd ff XX 00 00 00 XX 3b f9 ef XX    ???X??.X...X;??X
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX


# 配置P26 为输出
#P27在14号寄存器上,现在是ef .P27配为0 输出后是6F

root@j7-evm:~# i2cset -y -f 3 0x22 0x0e 0x6f
root@j7-evm:~# i2cdump -f -y 3 0x22 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 0c 84 f1 XX 3f fd ff XX 00 00 00 XX 3b f9 6f XX    ???X??.X...X;?oX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: 0c 84 f1 XX 3f fd ff XX 00 00 00 XX 3b f9 6f XX    ???X??.X...X;?oX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX


#再将P26输出数据配置为0 在6号寄存器上 改成7F
root@j7-evm:~# i2cset -f -y 3 0x22 0x06 0x7F
root@j7-evm:~# i2cdump -f -y 3 0x22 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 0c 84 71 XX 3f fd 7f XX 00 00 00 XX 3b f9 6f XX    ??qX???X...X;?oX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: 0c 84 71 XX 3f fd 7f XX 00 00 00 XX 3b f9 6f XX    ??qX???X...X;?oX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX

可以看到一个灯亮了!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/843773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[CKA]考试之查看pod的cpu

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 找出标签是namecpu-loader的Pod,并过滤出使用CPU最高的Pod&#…

MCUXpresso for VS Code -- 基于VSCode开发RT1176

MCUXpresso for VS Code 是nxp推出插件,旗下MCX LPC, Kinetis和i.MX rt等MCU,都能在VS Code平台进行嵌入式开发。功能框图如下: 前期准备: 软件环境: windows(实际可以跨系统,linux和mac没有测试) VS Code ninja CMa…

LeetCode 热题 100 JavaScript--206. 反转链表

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} head* return {ListNode}*/1、逐个断键,将后一个节点放到前面 …

C语言笔试训练【第四天】

文章目录 1、设变量已正确定义&#xff0c;以下不能统计出一行中输入字符个数&#xff08;不包含回车符&#xff09;的程序段是&#xff08; &#xff09; 2、运行以下程序后&#xff0c;如果从键盘上输入 65 14<回车> &#xff0c;则输出结果为&#xff08; &#xff0…

centos7 yum源安装出错及更新问题

如下 首先&#xff0c;在搜索jdk时报错如下&#xff1a; 解决办法 1、进入 yum的repo目录 cd /etc/yum.repos.d/2、修改所有的CentOS文件内容 sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://vau…

《南方都市报》:大众点评等互联网平台陷医美虚假“种草”质疑,或涉嫌违规广告

植发、整容&#xff0c;正在走向大众。近日&#xff0c;“妈妈带高考结束女儿整容提升自信”“长沙学生族暑假扎堆整容”等多个相关话题冲上热搜&#xff0c;学生整形热引发广泛关注。 爱美之心&#xff0c;人皆有之&#xff0c;当下早不是谈整容色变的时候&#xff0c;有人在…

【深度学习中的批量归一化BN和层归一化LN】BN层(Batch Normalization)和LN层(Layer Normalization)的区别

文章目录 1、概述2、BN层3、LN层4、Pytorch的实现5、BN层和LN层的对比 1、概述 归一化(Normalization) 方法&#xff1a;指的是把不同维度的特征&#xff08;例如序列特征或者图像的特征图等&#xff09;转换为相同或相似的尺度范围内的方法&#xff0c;比如把数据特征映射到[…

IO学习-有名管道

1&#xff0c;要求实现AB进程对话 A进程先发送一句话给B进程&#xff0c;B进程接收后打印 B进程再回复一句话给A进程&#xff0c;A进程接收后打印 重复1.2步骤&#xff0c;当收到quit后&#xff0c;要结束AB进程 运行结果&#xff1a;

【面试八股文】每日一题:谈谈你对集合的理解

每日一题-Java核心-谈谈你对集合的理解【面试八股文】 谈谈你对集合的理解 Java集合是Java编程语言中用于存储数据的容器。它提供了一系列的类和接口&#xff0c;用于操作和管理数据集合。Java集合框架主要包括以下几个重要的接口和类&#xff1a; List&#xff1a;List是一个有…

掌握 JVM 调优命令

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM 日常调优总结起来就是&#xff1a;首先通过 jps 命令查看当前进程&#xff0c;然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数&#xff0c;通过 jstat 命令查看 cla…

火力全开!百度文心3.5三大维度、20项指标国内问鼎!

近日&#xff0c;清华大学新闻与传播学院沈阳团队发布《大语言模型综合性能评估报告》&#xff08;下文简称“报告”&#xff09;&#xff0c;报告显示百度文心一言在三大维度20项指标中综合评分国内第一&#xff0c;超越ChatGPT&#xff0c;其中中文语义理解排名第一&#xff…

8.7一日总结

后台管理项目(使用vue3) 1.创建项目 npm init vuelatest 2.进入项目,下载依赖 3.下载需要的项目依赖 下载重置样式表 npm install reset-css 在main.js中阴入 import reset-css 4.清理目录 将项目中不需要的内容删除 5.运行项目 npm run dev 6.将仓库推送…

Kubectl 详解

目录 陈述式资源管理方法:项目的生命周期:创建-->发布-->更新-->回滚-->删除声明式管理方法:陈述式资源管理方法: kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将…

线程池优雅关闭

背景 线程池是日常我们写代码时经常打交道的知识点了&#xff0c;围绕线程池除了core核心线程数和最大max线程数的知识点外&#xff0c;我们一般会忽略然而却绕不开的问题时如何关闭线程池 如何关闭线程池 首先从优雅关闭线程池代码说起&#xff1a; public boolean graful…

在oracle SQL中创建返回表的函数

这是我的职责 create or replace FUNCTION split(i_str IN VARCHAR2,i_delim IN VARCHAR2 DEFAULT : ) RETURN TABLE AS BEGINRETURN SELECT trim(regexp_substr(i_str, [^||i_delim||], 1, LEVEL)) str FROM projetCONNECT BY instr(i_str, i_delim, 1, LEVEL - 1) …

Android安卓实战项目(10)---详细记录饮食与训练计划App【大Demo】可记录每日消耗和数据面板(源码在文末)可用于比赛项目或者作业参考中

Android安卓实战项目&#xff08;10&#xff09;—详细记录饮食与训练计划App【大Demo】可记录每日消耗和数据面板&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09;可用于比赛项目或者作业参考中 【bilibili演示】 https://www.bilibili.com/video…

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】

决策树进行鸢尾花分类的案例 背景说明&#xff1a; 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型&#xff0c;这是一个分类模型案例&#xff0c;通过该案例&#xff0c;可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…

算法通关村第四关——如何基于数组实现栈

1.栈的基础知识 1.1 栈的特征 栈&#xff08;Stack&#xff09;&#xff1a;具有一定操作约束的线性表&#xff0c;只在一端&#xff08;栈顶&#xff0c;Top&#xff09;做插入&#xff08;Push&#xff09;、删除(Pop)&#xff0c;不可操作的一端称为栈底&#xff08;Botto…

C高级--day4(wc指令、case...in、while循环、for循环、select..in、break、continue、shell中的函数)

#!/bin/bash function fun() {uidid -u $namegidid -g $nameecho $uid $gid } read name retfun $name echo $ret

【docker】设置 docker 国内镜像报错问题,解决方案

一、报错&#xff1a; [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因&#xf…