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驱动:

阅读剩余
THE END