14-Linux gpio模拟spi

14-Linux gpio模拟spi,第1张

首先是spidev,要在/dev/下面产生设备文件,需要spidev的支持

使用的是gpio模拟spi,gpio模拟spi的时序原理是bitbang文件实现的,所以这个也需要打开,如果是在openwrt下动态加载的话就是如下两个配置

如果是直接内核的话是如下两个

跟I2C的arch层一样,主要是devices的添加和board_info的添加,如下

对于platform_add_devices,因为是使用spi_gpio,所以name是"spi_gpio"这样才可以与driver里面的spi_gpio相互匹配probe到。

因为SPI是可以一个总线上面挂多个,然后通过片选脚CS进行硬件切换,所以这变有个num_chipselect需要设置,如果有2个设置就设置2,一个设备就设置1,这边设置好之后,后面board_info也要有对应的个数,而且片选引脚需要不同。

I2C是通过每个设备有自己不同的地址,通过地址来进行软件切换。

对于board_info使用的是spidev,drivers/spi/spidev.c文件,该文件的内容是注册一个spidev驱动。该驱动是一个字符设备驱动。

如果设备与驱动匹配,那么就会执行spidev_probe()的内容。在spidev_probe()函数中会调用device_create()成功后在 /dev 目录下就会生成 spidev 相关的设备节点。

这边有几个参数要注意:

调试过程想看一些细节的debug信息可以打开内核的动态debug信息,这个在以前的print system里面有

printk的等级设置成8.

开始

定位到是 spi_gpio_request 的时候报错

后面就将zkernel/3.10.49/arch/mips/mtk/ziroom/zrmt7628.c里面GPIO的信息调整下, 因为SPI的引脚和LED的引脚号一样 ,内核不知道哪里会检测到。

修改后打印如下:

之后在/dev/下面就生成了spidev1.0的设备

有了/dev/spidev1.0设备之后,就可以在应用成 *** 作改设备收发数据。

在drivers/spi/spidev.c里面已经封装好了ioctl的对应接口,根据这些接口就可以测试使用。

在Documentation/spi/spidev_test.c下面有个应用层的实例,打开看下就清除了。

$(cc) spidev_test.c -o spidev_test生成可执行文件spidev_test

然后拷贝到板子上,将MOSI和MISO短接就可以测试回环数据是否正常。

有逻辑分析仪的接上logic看波形就更加直观。

gpio模拟SPI:

https://blog.csdn.net/luckywang1103/article/details/70145870

在ARM Linux下使用GPIO模拟SPI时序详解:

https://blog.csdn.net/yangzheng_yz/article/details/50470577

linux SPI驱动:

https://www.cnblogs.com/xuyh/category/903809.html

本文基于 RockPI 4A 单板 Linux 4.4 内核介绍 RK3399 Linux GPIO 功能。

GPIO(General Purpose Input/Output Port) :通用输入输出端口。

除作为一般的输入/输出功能外,还可以配置为中断和模拟 PWM、I2C 等接口功能。

RK3399 GPIO 属性如下:

1、一共有5组 GPIO(GPIO0~4) ,每组 GPIO 为一个 Bank ,共32个引脚。每个 Bank 包括4个 Group (GPIOA(0~7) ~ D(0~7)) 。不是所有 Bank 都有 GPIOA~D 的编号, RK3399 共122个 GPIO 引脚。

2、所有 GPIO 都可被配置为 CA55或CA53 的中断功能,且 GPIO0 和 GPIO1 可用于系统低功耗唤醒模式。

3、在上电复位后,所有 GPIO 默认输入状态。

4、软件可配置 GPIO 驱动强度。

RK3399 引脚在系统中显示如下:

RK3399 GPIO 引脚号计算方式:

例:

以 ROCKPI 4A 单板 WIFI 模块电源( GPIO0_B2 )为例,介绍 DTS 中 GPIO 配置。

在系统启动后,可以查看 GPIO ,命令如下:

注:

如果debugfs没有挂载,使用下面命令挂载

Linux 内核 GPIO 主要实现文件:

GPIO 子系统有两套 API :

1、基于描述符(descriptor-based)

前缀为: gpiod_ 。

参考: Documentation/gpio/consumer.txt

2、老版本接口(legacy)

前缀为: gpio_ 。

参考: Documentation/gpio/gpio-legacy.txt

3、常用API

GPIO 还有很多接口,就不一一列举了。

RK3399 GPIO 控制器驱动实现文件: drivers/pinctrl/pinctrl-rockchip.c ,涉及主要函数:

所有 GPIO 子系统的 API 最终都会调到 SOC 的 GPIO 控制器驱动函数。

ROCKPi 4A 单板有个40个引脚的扩展口,引用 radxa 图片,见下图。

1、进入测试目录

2、导出GPIO

在使用 GPIO2_A7 前,需要导出该引脚。方法:配置 export 后,会出现 gpio71 节点。

测试时,注意不要使用在程序中已经申请过或配置为其它功能的 GPIO 引脚。

3、配置GPIO方向

设置 GPIO2_A7 的输入/输出方向。

in :表示输入。

out :表示输出。

active_low :用于中断配置中高电平或低电平有效。

edge :用于中断配置中上升沿或下降沿有效。

4、配置GPIO输出值

在 GPIO 为输入时,通过 value 查询 GPIO 的输入电平(高或低电平)。

在 GPIO 为输出时,通过 value 配置 GPIO 的输出电平(高或低电平)。

5、查看GPIO

查看已经导出的 GPIO71 。

6、取消导出

使用完 GPIO2_A7 后,需要进行释放。方法:配置 unexport 后, gpio71 节点会消失。

方法/步骤

1

安装SD Linux系统

如图所示,先后将Arduino Software 1.5.3 (Arduino IDE)和SD-Card Linux Image下载到本机,Arduino IDE在后面查找GPIO与Arduino IO 之间的映射关系时需要用到。

如图所示,将SDCard1.0.4.tar.bz2解压后出现一个“image-full-galileo”的文件夹。

在MicroSD使用前需先将其以Fat32进行格式化,然后将“image-full-galileo”文件夹下地所有文件直接拷贝到microSD卡的根目录下。

进入Galileo

将MicroSD插到Galileo中,在路由器页面的已连接设备列表中会看到设备名称为“clanton”有线连接设备,找到其IP地址,然后中

Terminal(Unix和Linux,Windows可用Putty)中通过ssh进入Galileo,“ssh

root@192.168.199.121”。

有意思的是,这个在MicroSD中运行的Linux系统开启了ssh服务,并且root账号没有设置密码,可以直接进入。如上图所示,d出一对话框后输入 “yes”回车即可进入Galileo,出现下图中的 “root@clanton”说明这一步成功完成了

到这里,可能会有疑问了,Galileo板载也是有一个 *** 作系统的,microSD卡中也有一个Linux,如何保证现在进入的就是microSD卡中的系

统呢?在Terminal中输入“cat/proc/version”即可查看Linux系统版本,显示为“3.8.7-yocto-standard”,这就是前面下载的为Galileo定制的Linux *** 作系统,Yocto。

找到那个属于你的GPIO

下面就要开始这篇文章中的核心部分,也是最难的一部。找Linux GPIO 与 Arduino IO之间的映射关系!

如右图所示,在“/sys/class/gpio/”中有多大60多个GPIO,如何找出右侧GPIO与左侧Arduino IDE中对应的IO呢。

首先将0-13IO口全部设为“INPUT”输入模式

voidsetup(){//putyoursetupcodehere,torunonce:

pinMode(0,INPUT)pinMode(1,INPUT)pinMode(2,INPUT)pinMode(3,INPUT)

pinMode(4,INPUT)pinMode(5,INPUT)pinMode(6,INPUT)pinMode(7,INPUT)

pinMode(8,INPUT)pinMode(9,INPUT)pinMode(10,INPUT)

pinMode(11,INPUT)pinMode(12,INPUT)pinMode(13,INPUT)} voidloop(){

//putyourmaincodehere,torunrepeatedly: }

如图所示,左侧"pinMode(13,OUTPUT)"将13引脚变为输出模式,右侧gpio7变成out模式,因此gpio7对应的就是Arduino IO 13(pin13)

按照这种方法依次找出Arduino IO与GPIO之间如下的对应关系

GPIODigitalI/Ogpio11pin0

gpio12pin1 gpio13pin2 gpio14pin3 gpio6pin4 gpio0pin5 gpio1pin6

gpio38pin7 gpio40pin8 gpio4pin9 gpio10pin10 gpio5pin11 gpio15pin12

gpio7pin13

下面就需要来对上面找到的gpio对应关系进行验证了。“echo "out"

>/sys/class/gpio/gpio*/direction”为将gpio变为输出模式,“echo "1"

>/sys/class/gpio/gpio*/value”为将gpio输出高电平。然后就有了下面这段python程序,这段程序依次将

pin13,pin12,pin11,pin10四个引脚的LED点亮然后关闭,但由于python程序的执行效率问题,应该所有LED同时点亮有了延时

成为流水灯,如下图所示效果。这段程序在Linux系统的任意文件夹内均可。

importos,timewhileTrue:os.system('echo"out">/sys/class/gpio/gpio7/direction')

os.system('echo"1">/sys/class/gpio/gpio7/value')

os.system('echo"out">/sys/class/gpio/gpio15/direction')

os.system('echo"1">/sys/class/gpio/gpio15/value')

os.system('echo"out">/sys/class/gpio/gpio5/direction')

os.system('echo"1">/sys/class/gpio/gpio5/value')

os.system('echo"out">/sys/class/gpio/gpio10/direction')

os.system('echo"1">/sys/class/gpio/gpio10/value') time.sleep(0.2)

os.system('echo"0">/sys/class/gpio/gpio5/value')

os.system('echo"0">/sys/class/gpio/gpio15/value')

os.system('echo"0">/sys/class/gpio/gpio7/value')

os.system('echo"0">/sys/class/gpio/gpio10/value') time.sleep(0.2)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7607673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-07
下一篇 2023-04-07

发表评论

登录后才能评论

评论列表(0条)

保存