如下圖,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相關函數就移植結束了。
後面會對這些函數使用寫教程。