gpio linux(gpio驱动)
如何在Linux系统中直接操作GPIO
方法/步骤
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账号没有设置密码,可以直接进入。如上图所示,弹出一对话框后输入“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)
Linux GPIO模拟I2C驱动
无论是Linux系统还是单片机,GPIO模拟I2C均通过控制SDA和SCL线的电平高低来产生信号。
主要包括模拟起始信号、停止信号,以及读写信号。
这属于platform驱动,而非I2C设备驱动。
在Linux系统中,无论是x86还是arm架构,都可以直接使用现成的i2c-gpio.ko驱动来实现GPIO模拟I2C Bus。
加载该驱动后,可以通过i2cdetect命令扫描总线下存在的I2C设备。
驱动分析:
1.判断使用of或者platform获取GPIO信息,例如of,使用of_property_read_u32和of_property_read_bool函数获取dts配置的数据。
2.设置GPIO模式,通过i2c_gpio_get_desc调用devm_gpiod_get或devm_gpiod_get_index函数获取资源。
3.设置GPIO读写函数,包括sda读写和scl读写,时钟设置等。
4.设置I2C bus时钟和timeout。
5.添加I2C bus,包括添加i2c_bit_algo,具体实现I2C start、data、stop等功能,无需i2c-gpio.c实现。
类似单价需要自行实现IIC_Start和IIC_Stop等操作。
2.添加add_adapter,i2c_bit_algo->bit_xfer函数根据I2C协议规定,实现发送起始信号->数据传输->停止信号的过程。
linux嵌入式 如何读取GPIO输入的数据,使用那个函数
1.首先,建立交叉编译环境:交叉编译是指:在PC机上编译,在目标板上执行,我PC是linux+ arm-elf-gcc编译器.扳子是ARM3000.板子上的系统是uclinux,这时一个剪裁的很小的实时嵌入式linux操作系统.推荐使用这个.
2.然后就是你写程序喽,不过注意可能有些库函数不能用,因为哪个编译器稍微受限一点,不是所由的c库函数都支持,不过一般开发的都有.
3.连起你的主机和开发板,这个你会不?要连两个:串口(用来控制板子)和以太口(用来下载程序),我们板子上这些外设都有,你要使没有可以用其他的口代替传程序,但串口可是该有的阿!
4.在你主机上编译程序生成目标代码,建议用makefile文件来组织你的联编关系.
5.把生成代码下载到目标板执行调试.我是用的主机的NFS(网落文件)服务,下载到目标板的.
6.注:目标板是怎么控制的呢?是用串口控制的,可用minicom,设置好你要控制的串口,也应该是你连板子的那个.在命令行里敲上minicom,即进入minicom截面,开启你的板子,应该就是板子uclinux系统解压安装的画面了.然后用ifconfig eth0.....
配置ip,这个ip就是你板子的ip了,注意与主机一个网段.然后mount-t nfs主机ip:/uclinux/板子上的一个目录,就把主机的 uclinux目录放到板子上了(这么说其实不合理,应该叫挂载).然后找到你刚才一经编译好的哪个目标代码执行即可.
因不了解你的具体环境和配置,暂说这些,有问题可再联系:)