如下图,AliOS Things是一个分层+组件架构,可以较简单的移植到各类MCU及Connectivity SoC平台上。
典型移植流程是这样的
查看我们的源码目录可以看到目前官方已经进行了HAL层的UART、flash和网络部分适配。我们想实现硬件的点灯就要使用GPIO
需要我们自行移植HAL部分实现。就我的实现流程进行一个记录。
通过API文档可以了解我们需要对如下函数进行适配。
实质上AliOS-Things也是使用了原厂的SDK进行修改适配
所以我们可以根据原厂的demo对GPIO部分进行了解。
driver/wm_gpio.c是w600的原厂GPIO库,我们可以根据这个重新封装我们AliOS-Things抽象函数
首先是hal_gpio_init,这是GPIO初始化函数,通过api参考我们可以看到SDK提供的tls_gpio_cfg和hal_gpio_init结构很相似,所以我们只需要按照接口说明进行稍加修改就可以适配(文档接口部分写错了个地方,第二个OUTPUT_OPEN_DRAIN_NO_PULL 应该为OUTPUT_OPEN_DRAIN_PULL_UP)
我们在platform\mcu\wm_w600\hal新建一个gpio.c作为GPIO部分的一个接管。根据两者的文档可以得到以下代码。
int32_t hal_gpio_init(gpio_dev_t *gpio)
{
if (gpio->port == NULL)
{
return -1;
}
u8_t gpio_dir = 0;
u8_t gpio_attr = 0;
switch (gpio->config)
{
/* 管脚用作功能引脚,如用于pwm输出,uart的输入引脚 */
case ANALOG_MODE:
break;
/* 中断模式,配置为中断源 */
case IRQ_MODE:
gpio_dir = WM_GPIO_DIR_INPUT;
gpio_attr = WM_GPIO_ATTR_FLOATING;
break;
/* 输入模式,内部包含一个上拉电阻 */
case INPUT_PULL_UP:
gpio_dir = WM_GPIO_DIR_INPUT;
gpio_attr = WM_GPIO_ATTR_PULLHIGH;
break;
/* 输入模式,内部包含一个下拉电阻 */
case INPUT_PULL_DOWN:
gpio_dir = WM_GPIO_DIR_INPUT;
gpio_attr = WM_GPIO_ATTR_PULLLOW;
break;
/* 输入模式,内部为高阻模式 */
case INPUT_HIGH_IMPEDANCE:
return -1; //W600没有高阻模式
/* 输出模式,普通模式 */
case OUTPUT_PUSH_PULL:
gpio_dir = WM_GPIO_DIR_OUTPUT;
gpio_attr = WM_GPIO_ATTR_FLOATING;
break;
/* 输出模式,输出高电平时,内部为高阻状态 */
case OUTPUT_OPEN_DRAIN_PULL_UP:
gpio_dir = WM_GPIO_DIR_OUTPUT;
gpio_attr = WM_GPIO_ATTR_PULLLOW;
break;
/* 输出模式,输出高电平时,被内部电阻拉高 */
case OUTPUT_OPEN_DRAIN_NO_PULL:
gpio_dir = WM_GPIO_DIR_OUTPUT;
gpio_attr = WM_GPIO_ATTR_PULLHIGH;
break;
default:
break;
}
tls_gpio_cfg(gpio->port, gpio_dir, gpio_attr);
return 0;
}
其他几个设置输出获取输入都比较简单,就不做解释了。针对中断部分再进行一下说明。我们可以参考SDK中demo\wm_gpio_demo.c的方法。
tls_gpio_isr_register
tls_gpio_irq_enable配置中断模式,AliOS-Things的中断表和W600库不相同,我们需要在我们的文件里重新定向一下。
实现函数
然后把gpio.c添加到platform\mcu\wm_w600\aos.mk即可
到此GPIO相关函数就移植结束了。
后面会对这些函数使用写教程。