NanoPC-T2 Linux Kernel对GPIO的初始化

之前在看NanoPC-T2 的Linux kernel中的以太网驱动程序发现,没有找到对以太网GPIO进行初始化的操作,感觉比较郁闷,今天对代码进行进一步分析,发现SOC的GPIO是统一进行配置的。在arch/arm/plat-s5p4418/nanopi2/board.c中有bd_gpio_init这个函数,而SOC每个引脚的作用是在arch/arm/plat-s5p4418/nanopi2/include/cfg_gpio.h这里定义的。



static void bd_gpio_init(void)
{
int index, bit;
int mode, func, out, lv, plup, stren;
U32 gpio;


const U32 pads[NUMBER_OF_GPIO_MODULE][32] = {
{ /* GPIO_A */
PAD_GPIOA0 , PAD_GPIOA1 , PAD_GPIOA2 , PAD_GPIOA3 , PAD_GPIOA4 , PAD_GPIOA5 , PAD_GPIOA6 , PAD_GPIOA7 , PAD_GPIOA8 , PAD_GPIOA9 ,
PAD_GPIOA10, PAD_GPIOA11, PAD_GPIOA12, PAD_GPIOA13, PAD_GPIOA14, PAD_GPIOA15, PAD_GPIOA16, PAD_GPIOA17, PAD_GPIOA18, PAD_GPIOA19,
PAD_GPIOA20, PAD_GPIOA21, PAD_GPIOA22, PAD_GPIOA23, PAD_GPIOA24, PAD_GPIOA25, PAD_GPIOA26, PAD_GPIOA27, PAD_GPIOA28, PAD_GPIOA29,
PAD_GPIOA30, PAD_GPIOA31
}, { /* GPIO_B */
PAD_GPIOB0 , PAD_GPIOB1 , PAD_GPIOB2 , PAD_GPIOB3 , PAD_GPIOB4 , PAD_GPIOB5 , PAD_GPIOB6 , PAD_GPIOB7 , PAD_GPIOB8 , PAD_GPIOB9 ,
PAD_GPIOB10, PAD_GPIOB11, PAD_GPIOB12, PAD_GPIOB13, PAD_GPIOB14, PAD_GPIOB15, PAD_GPIOB16, PAD_GPIOB17, PAD_GPIOB18, PAD_GPIOB19,
PAD_GPIOB20, PAD_GPIOB21, PAD_GPIOB22, PAD_GPIOB23, PAD_GPIOB24, PAD_GPIOB25, PAD_GPIOB26, PAD_GPIOB27, PAD_GPIOB28, PAD_GPIOB29,
PAD_GPIOB30, PAD_GPIOB31
}, { /* GPIO_C */
PAD_GPIOC0 , PAD_GPIOC1 , PAD_GPIOC2 , PAD_GPIOC3 , PAD_GPIOC4 , PAD_GPIOC5 , PAD_GPIOC6 , PAD_GPIOC7 , PAD_GPIOC8 , PAD_GPIOC9 ,
PAD_GPIOC10, PAD_GPIOC11, PAD_GPIOC12, PAD_GPIOC13, PAD_GPIOC14, PAD_GPIOC15, PAD_GPIOC16, PAD_GPIOC17, PAD_GPIOC18, PAD_GPIOC19,
PAD_GPIOC20, PAD_GPIOC21, PAD_GPIOC22, PAD_GPIOC23, PAD_GPIOC24, PAD_GPIOC25, PAD_GPIOC26, PAD_GPIOC27, PAD_GPIOC28, PAD_GPIOC29,
PAD_GPIOC30, PAD_GPIOC31
}, { /* GPIO_D */
PAD_GPIOD0 , PAD_GPIOD1 , PAD_GPIOD2 , PAD_GPIOD3 , PAD_GPIOD4 , PAD_GPIOD5 , PAD_GPIOD6 , PAD_GPIOD7 , PAD_GPIOD8 , PAD_GPIOD9 ,
PAD_GPIOD10, PAD_GPIOD11, PAD_GPIOD12, PAD_GPIOD13, PAD_GPIOD14, PAD_GPIOD15, PAD_GPIOD16, PAD_GPIOD17, PAD_GPIOD18, PAD_GPIOD19,
PAD_GPIOD20, PAD_GPIOD21, PAD_GPIOD22, PAD_GPIOD23, PAD_GPIOD24, PAD_GPIOD25, PAD_GPIOD26, PAD_GPIOD27, PAD_GPIOD28, PAD_GPIOD29,
PAD_GPIOD30, PAD_GPIOD31
}, { /* GPIO_E */
PAD_GPIOE0 , PAD_GPIOE1 , PAD_GPIOE2 , PAD_GPIOE3 , PAD_GPIOE4 , PAD_GPIOE5 , PAD_GPIOE6 , PAD_GPIOE7 , PAD_GPIOE8 , PAD_GPIOE9 ,
PAD_GPIOE10, PAD_GPIOE11, PAD_GPIOE12, PAD_GPIOE13, PAD_GPIOE14, PAD_GPIOE15, PAD_GPIOE16, PAD_GPIOE17, PAD_GPIOE18, PAD_GPIOE19,
PAD_GPIOE20, PAD_GPIOE21, PAD_GPIOE22, PAD_GPIOE23, PAD_GPIOE24, PAD_GPIOE25, PAD_GPIOE26, PAD_GPIOE27, PAD_GPIOE28, PAD_GPIOE29,
PAD_GPIOE30, PAD_GPIOE31
},
};


/* GPIO pad function */
for (index = 0; index < NUMBER_OF_GPIO_MODULE; index++) {


NX_GPIO_ClearInterruptPendingAll(index);


for (bit = 0; bit < 32; bit++) {
gpio  = pads[index][bit];
func  = PAD_GET_FUNC(gpio);
mode  = PAD_GET_MODE(gpio);
lv    = PAD_GET_LEVEL(gpio);
stren = PAD_GET_STRENGTH(gpio);
plup  = PAD_GET_PULLUP(gpio);


/* get pad alternate function (0,1,2,4) */
switch (func) {
case PAD_GET_FUNC(PAD_FUNC_ALT0): func = NX_GPIO_PADFUNC_0; break;
case PAD_GET_FUNC(PAD_FUNC_ALT1): func = NX_GPIO_PADFUNC_1; break;
case PAD_GET_FUNC(PAD_FUNC_ALT2): func = NX_GPIO_PADFUNC_2; break;
case PAD_GET_FUNC(PAD_FUNC_ALT3): func = NX_GPIO_PADFUNC_3; break;
default: printk("ERROR, unknown alt func (%d.%02d=%d)\n", index, bit, func);
continue;
}


switch (mode) {
case PAD_GET_MODE(PAD_MODE_ALT): out = 0;
case PAD_GET_MODE(PAD_MODE_IN ): out = 0;
case PAD_GET_MODE(PAD_MODE_INT): out = 0; break;
case PAD_GET_MODE(PAD_MODE_OUT): out = 1; break;
default: printk("ERROR, unknown io mode (%d.%02d=%d)\n", index, bit, mode);
continue;
}


NX_GPIO_SetPadFunction(index, bit, func);
NX_GPIO_SetOutputEnable(index, bit, (out ? CTRUE : CFALSE));
NX_GPIO_SetOutputValue(index, bit,  (lv  ? CTRUE : CFALSE));
NX_GPIO_SetInterruptMode(index, bit, (lv));


NX_GPIO_SetPullMode(index, bit, plup);
set_gpio_strenth(index, bit, stren); /* pad strength */
}


NX_GPIO_SetDRV0_DISABLE_DEFAULT(index, 0xFFFFFFFF);
NX_GPIO_SetDRV1_DISABLE_DEFAULT(index, 0xFFFFFFFF);
}
}





NanoPC-T4上使用QT实现DHT11的步骤与在Arduino上实现类似,只需要将传感器连接到NanoPC-T4上,并使用GPIO库读取传感器数据。下面是一个简单的步骤: 1. 首先,你需要在NanoPC-T4上安装QT,并在QT中安装GPIO库,这可以通过以下命令来完成: ``` sudo apt-get update sudo apt-get install qtbase5-dev sudo apt-get install qtdeclarative5-dev sudo apt-get install qml-module-qtquick-controls sudo apt-get install qml-module-qtquick-dialogs sudo apt-get install qml-module-qtquick-layouts sudo apt-get install qml-module-qtquick-window2 sudo apt-get install qml-module-qt-labs-settings sudo apt-get install libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5widgets5 libqt5serialport5-dev ``` 2. 将DHT11模块连接到NanoPC-T4上。将DHT11的VCC引脚连接到NanoPC-T4的5V引脚,将GND引脚连接到NanoPC-T4的GND引脚,将DHT11的数据引脚连接到NanoPC-T4上的GPIO引脚上(例如:GPIOA0)。 3. 在QT中创建一个新的项目,并在项目中添加以下代码: ```c++ #include <QCoreApplication> #include <QDebug> #include <wiringPi.h> #include <dht.h> #define DHTPIN 0 // DHT11数据引脚的GPIO引脚 #define DHTTYPE DHT11 // DHT11传感器类型 dht DHT; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); if (wiringPiSetup () == -1) // 初始化wiringPi库 { qDebug() << "Failed to setup wiringPi!"; return -1; } while(1) { int chk = DHT.read11(DHTPIN); // 读取DHT11传感器 qDebug() << "湿度: " << DHT.humidity << "%, " << "温度: " << DHT.temperature << "°C"; delay(1000); // 稍作延迟 } return a.exec(); } ``` 4. 编译并运行代码。你将在QT控制台中看到DHT11传感器的湿度和温度数据。 这就是在NanoPC-T4上使用QT实现DHT11的基本步骤。你可以根据你的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值