5 框架外设驱动

本章介绍基于框架的外设驱动。 外设驱动位于/app/peripheral/ 目录下,外设驱动需要实现pando object的相关接口,会涉及该外设以及esp8266的驱动,这需要参考各自的数据手册和编程手册,esp8266的驱动放在driver目录下。
esp8266的驱动有uart、SPI、PWM、I2C、adc,和通用GPIO。

5.1 实现object的外设接口

一般是实现init、get,和set的功能。init对IO口进行定义和初始化,get即获取外设的状态,set需要执行指令,改变外设的状态。
这里依然接着上一章节的RGB的例子,在这里讲述怎么实现外设驱动。

5.1.1 引用相应的驱动文件

驱动RGB需要使用PWM功能,所以头文件里面需要引用pwm文件。
#include "driver/pwm.h"

5.1.2 实现init功能

对外设进行IO口定义和初始化,代码如下:

void ICACHE_FLASH_ATTR
peri_rgb_light_init(struct PWM_APP_PARAM light_param,struct PWM_INIT light_init)
{    
    spi_flash_write((PRIV_PARAM_START_SEC + RGB_LIGHT_PRIV_SAVE) * SPI_FLASH_SEC_SIZE,
            (uint32 *)&light_param, sizeof(struct PWM_APP_PARAM));

    pwm_init(light_param,light_init);
    pwm_start();    
}

5.1.3 实现set功能

传入新的值,更新pwm状态,代码如下:

void ICACHE_FLASH_ATTR 
peri_rgb_light_param_set( struct PWM_APP_PARAM light_param)
{
    pwm_set_freq(light_param.pwm_freq);
    pwm_set_duty(light_param.pwm_duty[0], 0); // red colour.
    pwm_set_duty(light_param.pwm_duty[1], 1); // green colour.
    pwm_set_duty(light_param.pwm_duty[2], 2); // blue colour.

    pwm_start();

    spi_flash_erase_sector(PRIV_PARAM_START_SEC + RGB_LIGHT_PRIV_SAVE);
    spi_flash_write((PRIV_PARAM_START_SEC + RGB_LIGHT_PRIV_SAVE) * SPI_FLASH_SEC_SIZE,
        (uint32 *)&light_param, sizeof(struct PWM_APP_PARAM));
}

5.1.4 实现get功能

返回当前外设的状态,实现代码如下:

struct PWM_APP_PARAM ICACHE_FLASH_ATTR
peri_rgb_light_param_get(void)
{
    struct PWM_APP_PARAM ret;

    spi_flash_read((PRIV_PARAM_START_SEC + RGB_LIGHT_PRIV_SAVE) * SPI_FLASH_SEC_SIZE,
        (uint32 *)&ret, sizeof(struct PWM_APP_PARAM));
    return ret;
}