linux驱动gpio linux gpio子系统
大家好,关于linux驱动gpio很多朋友都还不太明白,今天小编就来为大家分享关于linux gpio子系统的知识,希望对各位有所帮助!
Linux下数码管驱动程序实现linux数码管驱动
随着近些年的电子科技的发展,数码管变得越来越出色。它们是电子技术领域中使用最广泛的元器件,在很多产品中发挥着重要作用。为了让数码管功能正常运行,必须对其进行驱动。因此,Linux下的数码管驱动程序这么重要。
要实现Linux下数码管驱动程序,首先实用C语言编写一个简单的程序,根据数码管的连线实现驱动程序,可以选择使用GPIO引脚或借助外部芯片形成I/ O端口来连接数码管。
以stm32为例,实现数码管的驱动程序的第一步是定义IO口,这时可以在“stm32f10x.h”里面导出对应的IO口寄存器:
#define GPIOA*(( volatile unsigned int*) 0x40010800)
#define GPIOB*(( volatile unsigned int*) 0x40010C00)
#define GPIOC*(( volatile unsigned int*) 0x40011000)
接着需要定义数码管所需要的引脚,如下:
#define GPIO_CE GPIOA, 0x0008, 0x0001
#define GPIO_CLK GPIOA, 0x000C, 0x0002
#define GPIO_DA GPIOC, 0x0010, 0x0008
它们分别指向对应IO口和位。
最后,将上一步定义的IO口和位用GPIO函数编写下视数码管操作函数,如下所示:
void LED_Write_data(unsigned char LED_DATA,unsigned char command)
{
//延时
delay(1);
//拉低CE
GPIO_WriteBit(GPIO_CE, 0)
//CLK延时
delay(1);
//先传入发送命令,指定发送数据
GPIO_WriteBit(GPIO_DA,command);
//拉高CLK
GPIO_WriteBit(GPIO_CLK,1);
//CLK延时
delay(1);
//再传入发送数据
for(unsigned char i=0;i
{
GPIO_WriteBit(GPIO_DA,LED_DATA& 0x80);
//延时
delay(1);
//拉高CLK
GPIO_WriteBit(GPIO_CLK,1);
//拉低CLK
GPIO_WriteBit(GPIO_CLK,0);
//延时
delay(1);
LED_DATA= LED_DATA
}
//最后拉高CE管脚
GPIO_WriteBit(GPIO_CE,1);
}
执行上面定义的函数,可以操作数码管,可以在数码管上显示相应数据。
总之,实现Linux下的数码管驱动程序需要几个步骤。首先要定义IO口和位,然后使用GPIO函数编写数码管操作函数。最后,执行相应的程序就可以在数码管上显示相应数据了。
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协议规定,实现发送起始信号->数据传输->停止信号的过程。
14-Linux gpio模拟spi
首先是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:
在ARM Linux下使用GPIO模拟SPI时序详解:
linux SPI驱动: