如下图,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相关函数就移植结束了。
后面会对这些函数使用写教程。