示例#1
0
文件: blink.c 项目: wosayttn/aos
int application_start(int argc, char *argv[])
{
    /* gpio port config */
    led.port = GPIO_LED_IO;
    /* set as output mode */
    led.config = OUTPUT_PUSH_PULL;
    /* configure GPIO with the given settings */
    hal_gpio_init(&led);

    /* gpio port config */
    trigger.port = GPIO_TRIGGER_IO;
    /* set as output mode */
    trigger.config = OUTPUT_PUSH_PULL;
    /* configure GPIO with the given settings */
    hal_gpio_init(&trigger);

    /* input pin config */
    input.port = GPIO_INPUT_IO;
    /* set as interrupt mode */
    input.config = IRQ_MODE;
    /* configure GPIO with the given settings */
    hal_gpio_init(&input);

    /* gpio interrupt config */
    hal_gpio_enable_irq(&input, IRQ_TRIGGER_BOTH_EDGES, gpio_isr_handler, (void *) GPIO_INPUT_IO);

    aos_post_delayed_action(1000, app_trigger_low_action, NULL);
    aos_loop_run();

    return 0;
}
示例#2
0
void ssd1306_init(void)
{
	oled_spi_dev.port = 1;
	oled_spi_dev.config.mode = HAL_SPI_MODE_MASTER;
	oled_spi_dev.config.freq = 6000000;
	hal_spi_init(&oled_spi_dev);

	//config reset and ds pin
	gpio_oled_reset.port = 8; //PA8
	gpio_oled_reset.config = OUTPUT_PUSH_PULL;
	hal_gpio_init(&gpio_oled_reset);
	hal_gpio_output_high(&gpio_oled_reset);

	gpio_oled_cs.port = 22; //PA22
	gpio_oled_cs.config = OUTPUT_PUSH_PULL;
	hal_gpio_init(&gpio_oled_cs);
	hal_gpio_output_high(&gpio_oled_cs);
	aos_msleep(1);
	hal_gpio_output_low(&gpio_oled_cs);

	gpio_oled_ds.port = 20; //PA20
	gpio_oled_ds.config = OUTPUT_PUSH_PULL;
	hal_gpio_init(&gpio_oled_ds);
	hal_gpio_output_high(&gpio_oled_ds);

	aos_msleep(1);
	hal_gpio_output_low(&gpio_oled_reset);
	aos_msleep(1);
	hal_gpio_output_high(&gpio_oled_reset);

	//config oled
	ssd1306_write(SSD1306_DISPLAYOFF, SSD1306_CMD);
	ssd1306_write(SSD1306_SETDISPLAYCLOCKDIV, SSD1306_CMD);
	ssd1306_write(80, SSD1306_CMD);
	ssd1306_write(SSD1306_SETMULTIPLEX, SSD1306_CMD);
	ssd1306_write(0x3F, SSD1306_CMD);
	ssd1306_write(SSD1306_SETDISPLAYOFFSET, SSD1306_CMD);
	ssd1306_write(0x00, SSD1306_CMD);
	ssd1306_write(SSD1306_SETSTARTLINE, SSD1306_CMD);
	ssd1306_write(SSD1306_ENABLE_CHARGE_PUMP, SSD1306_CMD);
	ssd1306_write(0x14, SSD1306_CMD);
	ssd1306_write(SSD1306_MEMORYMODE, SSD1306_CMD);
	ssd1306_write(0x02, SSD1306_CMD);
	ssd1306_write(0xA1, SSD1306_CMD);
	ssd1306_write(SSD1306_COMSCANINC, SSD1306_CMD);
	ssd1306_write(SSD1306_SETCOMPINS, SSD1306_CMD);
	ssd1306_write(0X12, SSD1306_CMD);
	ssd1306_write(SSD1306_SETCONTRAST, SSD1306_CMD);
	ssd1306_write(0x1F, SSD1306_CMD); //set brightness
	ssd1306_write(SSD1306_SETPRECHARGE, SSD1306_CMD);
	ssd1306_write(0xF1, SSD1306_CMD);
	ssd1306_write(SSD1306_SETVCOMDETECT, SSD1306_CMD);
	ssd1306_write(0x30, SSD1306_CMD);
	ssd1306_write(SSD1306_DISPLAYALLON_RESUME, SSD1306_CMD);
	ssd1306_write(SSD1306_NORMALDISPLAY, SSD1306_CMD);
	ssd1306_write(SSD1306_DISPLAYON, SSD1306_CMD);

	return 0;
}
示例#3
0
__externC void CYGOPT_HAL_KINETIS_MISC_FLASH_SECTION_ATTR
hal_system_init( void )
{
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_SRAM)
    hal_wdog_disable();
    hal_gpio_init();
    hal_start_clocks();
#endif
#if defined(CYG_HAL_STARTUP_SRAM) && !defined(CYGHWR_HAL_CORTEXM_KINETIS_SRAM_UNIFIED)
    // Note: For CYG_HAL_STARTUP_SRAM, the SRAM_L bank simulates ROM
    // Relocate data from ROM to RAM
    {
        register cyg_uint32 *ram_p, *rom_p;
        for( ram_p = &__ram_data_start, rom_p = &__rom_data_start;
             ram_p < &__ram_data_end;
             ram_p++, rom_p++ )
            *ram_p = *rom_p;
    }

    // Relocate data from ROM to SRAM
    {
        register cyg_uint32 *ram_p, *sram_p;
        for( ram_p = &__sram_data_start, sram_p = &__srom_data_start;
             ram_p < &__sram_data_end;
             ram_p++, sram_p++ )
            *ram_p = *sram_p;
    }
#endif
}
示例#4
0
void board_init(void)
{
    gpio_key_boot.port = KEY_BOOT;
    gpio_key_boot.config = INPUT_PULL_UP;
    hal_gpio_init(&gpio_key_boot);

    hal_gpio_clear_irq(&gpio_key_boot);
    hal_gpio_enable_irq(&gpio_key_boot, IRQ_TRIGGER_FALLING_EDGE, handle_elink_key, NULL);

	gpio_key_ps.port = KEY_PS;
	gpio_key_ps.config = INPUT_PULL_UP;
	hal_gpio_init(&gpio_key_ps);
	
    hal_gpio_clear_irq(&gpio_key_ps);
    hal_gpio_enable_irq(&gpio_key_ps, IRQ_TRIGGER_FALLING_EDGE, handle_ps_key, NULL);
}
示例#5
0
extern hal_result_t hal_led_init(hal_led_t id, const hal_led_cfg_t *cfg)
{
    const hal_gpio_map_t *gm = NULL;
    hal_result_t res = hal_res_NOK_generic;

    if(hal_false == s_hal_led_supported_is(id))
    {
        return(hal_res_NOK_generic);
    }
    
    if(hal_true == s_hal_led_initted_is(id))
    {
        return(hal_res_OK);
    }       
     
    gm = &hal_led__theboardconfig.gpiomap[HAL_led_id2index(id)].led;
    
    // much better to init w/ hal_gpio_init() and not with hl_gpio_init() so that we fill the data structure of the gpio in hal.  
    res = hal_gpio_init(gm->gpio, &s_hal_led_gpio_config);
    
    if(hal_res_OK != res)
    {
        return(res);
    }
    
    s_hal_led_initted_set(id);    
    
    // hal_led_off() must be after s_hal_led_initted_set();
    hal_led_off(id);

    return(hal_res_OK);
}
 static hal_result_t s_hal_device_cantransceiver_simple_init(hal_cantransceiver_t id, void* initpar)
 {
     initpar = initpar;
     const hal_gpio_map_t* map = &s_hal_device_cantransceiver__gpiomapof_enable[(uint8_t)id];        
     hal_gpio_init(map->gpio, &map->config);        
     s_hal_device_cantransceiver_simple_disable(id);          
     return(hal_res_OK);
 }
/**
 * gpio init in
 *
 * Initializes the specified pin as an input
 *
 * @param pin   Pin number to set as input
 * @param pull  pull type
 *
 * @return int  0: no error; -1 otherwise.
 */
int
gpio_init_in(int pin, enum gpio_pull pull)
{
    GPIO_InitTypeDef init_cfg;

    init_cfg.GPIO_Mode = GPIO_Mode_IN;
    init_cfg.GPIO_Speed = GPIO_Speed_Level_2;
    init_cfg.GPIO_OType = GPIO_OType_PP;
    init_cfg.GPIO_PuPd = hal_gpio_pull_to_cfg(pull);

    return hal_gpio_init(pin, &init_cfg);
}
/**
 * gpio init af
 *
 * Configure the specified pin for AF.
 */
int
hal_gpio_init_af(int pin, uint8_t af_type, enum gpio_pull pull)
{
    GPIO_InitTypeDef gpio;

    gpio.Mode = GPIO_MODE_AF_PP;
    gpio.Speed = GPIO_SPEED_HIGH;
    gpio.Pull = pull;
    gpio.Alternate = af_type;

    return hal_gpio_init(pin, &gpio);
}
/**
 * gpio init in 
 *  
 * Initializes the specified pin as an input 
 * 
 * @param pin   Pin number to set as input
 * @param pull  pull type
 * 
 * @return int  0: no error; -1 otherwise. 
 */
int
gpio_init_in(int pin, gpio_pull_t pull)
{
    int rc;
    GPIO_InitTypeDef init_cfg;

    init_cfg.Mode = GPIO_MODE_INPUT;
    init_cfg.Pull = pull;

    rc = hal_gpio_init(pin, &init_cfg);
    return rc;
}
示例#10
0
/**
 * gpio init out
 *
 * Initialize the specified pin as an output, setting the pin to the specified
 * value.
 *
 * @param pin Pin number to set as output
 * @param val Value to set pin
 *
 * @return int  0: no error; -1 otherwise.
 */
int
gpio_init_out(int pin, int val)
{
    GPIO_InitTypeDef init_cfg;

    init_cfg.GPIO_Mode = GPIO_Mode_OUT;
    init_cfg.GPIO_Speed = GPIO_Speed_Level_2;
    init_cfg.GPIO_OType = GPIO_OType_PP;
    init_cfg.GPIO_PuPd = GPIO_PuPd_NOPULL;

    return hal_gpio_init(pin, &init_cfg);
}
/**
 * gpio init out 
 *  
 * Initialize the specified pin as an output, setting the pin to the specified 
 * value. 
 * 
 * @param pin Pin number to set as output
 * @param val Value to set pin
 * 
 * @return int  0: no error; -1 otherwise. 
 */
int gpio_init_out(int pin, int val)
{
    int rc;
    GPIO_InitTypeDef init_cfg;

    init_cfg.Mode = GPIO_MODE_OUTPUT_PP;
    init_cfg.Pull = GPIO_NOPULL;
    init_cfg.Speed = GPIO_SPEED_HIGH;
    init_cfg.Alternate = 0;

    rc = hal_gpio_init(pin, &init_cfg);
    return rc;
}
示例#12
0
文件: soc_init.c 项目: wosayttn/aos
static void brd_peri_init(void)
{
    int i;
    int gpcfg_num = sizeof(brd_gpio_table) / sizeof(brd_gpio_table[0]);

    for (i = 0; i < gpcfg_num; ++i) {
        hal_gpio_init(&brd_gpio_table[i]);
    }
    
    hal_i2c_init(&brd_i2c1_dev);
    hal_i2c_init(&brd_i2c2_dev);
    
}
示例#13
0
/**
 * gpio init af
 *
 * Configure the specified pin for AF.
 */
int
hal_gpio_init_af(int pin, uint8_t af_type, enum gpio_pull pull)
{
    GPIO_InitTypeDef gpio;
    int rc;

    gpio.GPIO_Mode = GPIO_Mode_AF;
    gpio.GPIO_Speed = GPIO_Speed_Level_2;
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = hal_gpio_pull_to_cfg(pull);

    rc = hal_gpio_init(pin, &gpio);
    if (rc == 0) {
        GPIO_PinAFConfig(portmap[GPIO_PORT(pin)], GPIO_INDEX(pin), af_type);
        rc = 0;
    }
    return rc;
}
示例#14
0
__externC void
hal_system_init(void)
{
#if defined(CYG_HAL_STARTUP_ROM) | defined(CYG_HAL_STARTUP_SRAM)
    hal_gpio_init();
#endif

#if defined(CYG_HAL_STARTUP_ROM)
    {
        // Set flash accelerator according to CPU clock speed.
        cyg_uint32      regval;
        HAL_READ_UINT32(CYGHWR_HAL_LPC17XX_REG_SCB_BASE +
                        CYGHWR_HAL_LPC17XX_REG_FLASHCFG, regval);
        regval &= ~CYGHWR_HAL_LPC17XX_REG_FLTIM_MASK;
        regval |= CYGHWR_HAL_LPC17XX_REG_FLASHTIM;
        HAL_WRITE_UINT32(CYGHWR_HAL_LPC17XX_REG_SCB_BASE +
                         CYGHWR_HAL_LPC17XX_REG_FLASHCFG, regval);
    }
#endif
}
static void s_hal_brdcfg_mc4plus_vaux_5v0_init(void)
{
#if !defined(NNNEW)    
    static uint8_t initted = 0;
    if(1 == initted)
    {
        return;
    }
#else
    if(1 == vaux_5v0_initted)
    {
        return;
    }    
#endif    
    hal_gpio_init(s_hal_brdcfg_mc4plus_vaux_5v0_gpiomap.gpio, &s_hal_brdcfg_mc4plus_vaux_5v0_gpiocfg); 
#if !defined(NNNEW)    
    initted = 1;
#else
    vaux_5v0_initted = 1;
#endif    
    s_hal_brdcfg_mc4plus_vaux_5v0_on();    
}
示例#16
0
extern hal_result_t hal_led_init(hal_led_t led, const hal_led_cfg_t *cfg)
{
    const hal_gpio_cfg_t *gc = NULL;
    hal_result_t res = hal_res_NOK_generic;

    if(hal_false == s_hal_led_supported_is(led))
    {
        return(hal_res_NOK_generic);
    }
     
    gc = &hal_brdcfg_led__cfg[HAL_led_t2index(led)];
    
    res = hal_gpio_init(gc->port, gc->pin, gc->dir, gc->speed);
    
    if(hal_res_OK != res)
    {
        return(res);
    }
 
    s_hal_led_initted_set(led);
    return(hal_res_OK);
}
示例#17
0
extern hal_result_t hal_5v_init(const hal_5v_cfg_t *cfg)
{
    hal_5v_theinternals_t* intitem = &s_hal_5v_theinternals;

    if(hal_false == s_hal_5v_supported_is())
    {
        return(hal_res_NOK_generic);
    }
    
    if(NULL == cfg)
    {
        cfg  = &hal_5v_cfg_default;
    }

    if(hal_true == s_hal_5v_initted_is())
    {
        if(0 == memcmp(cfg, &intitem->config, sizeof(hal_5v_cfg_t)))
        {   // ok only if the previously used config is the same as the current one
            return(hal_res_OK);
        }
        else
        {
            return(hal_res_NOK_generic);
        }
    }    
    
    
    // set config
    memcpy(&intitem->config, cfg, sizeof(hal_5v_cfg_t));
    
    // ok, now i init
    hal_gpio_init(hal_5v__theboardconfig.gpiomap.gpio, &hal_5v__theboardconfig.gpiocfg); 
    
    
    s_hal_5v_initted_set();

    return(hal_res_OK);
}
示例#18
0
extern hal_result_t hal_led_init(hal_led_t id, const hal_led_cfg_t *cfg)
{
    const hal_gpio_maP_t *gm = NULL;
    hal_result_t res = hal_res_NOK_generic;

    if(hal_false == s_hal_device_led_supported_is(id))
    {
        return(hal_res_NOK_generic);
    }
     
    gm = &hal_brdcfg_device_led__theconfig.gpiomap[HAL_device_led_id2index(id)].led;
    
    res = hal_gpio_init(gm->gpio, &s_hal_led_gpio_config);
    
    if(hal_res_OK != res)
    {
        return(res);
    }
    
    hal_gpio_setval(gm->gpio, hal_brdcfg_device_led__theconfig.value_off);
 
    s_hal_device_led_initted_set(id);
    return(hal_res_OK);
}
static void s_hal_spi_hw_gpio_init(hal_spi_t id, hal_spi_ownership_t ownership)
{

#if     defined(HAL_USE_CPU_FAM_STM32F1)

    static const GPIO_InitTypeDef  s_hal_spi_sckmosi_master_altcfg  =
    {
        .GPIO_Pin       = 0,
        .GPIO_Speed     = GPIO_Speed_50MHz,
        .GPIO_Mode      = GPIO_Mode_AF_PP, // il PP serve per spi del display3 .... GPIO_Mode_AF_OD,
    };

    static const GPIO_InitTypeDef  s_hal_spi_miso_master_altcfg  =
    {
        .GPIO_Pin       = 0,
        .GPIO_Speed     = GPIO_Speed_50MHz,
        .GPIO_Mode      = GPIO_Mode_IN_FLOATING, //GPIO_Mode_IPD, // oppure ... GPIO_Mode_IN_FLOATING?
    };

    static const GPIO_InitTypeDef  s_hal_spi_sckmosi_slave_altcfg  =
    {
        .GPIO_Pin       = 0,
        .GPIO_Speed     = GPIO_Speed_50MHz,
        .GPIO_Mode      = GPIO_Mode_IN_FLOATING, //GPIO_Mode_IPD, // oppure ... GPIO_Mode_IN_FLOATING,
    };

    static const GPIO_InitTypeDef  s_hal_spi_miso_slave_altcfg  =
    {
        .GPIO_Pin       = 0,
        .GPIO_Speed     = GPIO_Speed_50MHz,
        .GPIO_Mode      = GPIO_Mode_AF_PP,
    };


    // 1. prepare af.
    // for spi1 (sck, miso, mosi): no-remap if it is (PA5, PA6, PA7). GPIO_Remap_SPI1 if it is (PB3, PB4, PB5).
    // for spi2 (sck, miso, mosi): no remap if it is (PB13, PB14, PB15).
    // for spi3 (sck, miso, mosi): no-remap if it is (PB3, PB4, PB5). GPIO_Remap_SPI3 if it is (PC10, PC11, PC12).
    uint32_t afname = HAL_GPIO_AFNAME_NONE;
    uint32_t afmode = HAL_GPIO_AFMODE_NONE;
    hal_bool_t found = hal_false;

    hal_gpio_port_t portsck  = hal_brdcfg_spi__theconfig.gpio_sck[HAL_spi_id2index(id)].gpio.port;
    hal_gpio_pin_t  pinsck   = hal_brdcfg_spi__theconfig.gpio_sck[HAL_spi_id2index(id)].gpio.pin;
    hal_gpio_port_t portmiso = hal_brdcfg_spi__theconfig.gpio_miso[HAL_spi_id2index(id)].gpio.port;
    hal_gpio_pin_t  pinmiso  = hal_brdcfg_spi__theconfig.gpio_miso[HAL_spi_id2index(id)].gpio.pin;
    hal_gpio_port_t portmosi = hal_brdcfg_spi__theconfig.gpio_mosi[HAL_spi_id2index(id)].gpio.port;
    hal_gpio_pin_t  pinmosi  = hal_brdcfg_spi__theconfig.gpio_mosi[HAL_spi_id2index(id)].gpio.pin;


    if(hal_spi1 == id)
    {
        if((hal_gpio_portA == portsck) && (hal_gpio_pin5 == pinsck) && (hal_gpio_portA == portmiso) && (hal_gpio_pin6 == pinmiso) && (hal_gpio_portA == portmosi) && (hal_gpio_pin7 == pinmosi))
        {   // PA5, PA6, PA7
            afname = HAL_GPIO_AFNAME_NONE;
            afmode = HAL_GPIO_AFMODE_NONE;
            found = hal_true;
        }
        else if((hal_gpio_portB == portsck) && (hal_gpio_pin3 == pinsck) && (hal_gpio_portB == portmiso) && (hal_gpio_pin4 == pinmiso) && (hal_gpio_portB == portmosi) && (hal_gpio_pin5 == pinmosi))
        {   // PB3, PB4, PB5
            afname = GPIO_Remap_SPI1;
            afmode = ENABLE;
            found = hal_true;
        }
    }
    else if(hal_spi2 == id)
    {
        if((hal_gpio_portB == portmiso) && (hal_gpio_portB == portmosi) && (hal_gpio_portB == portsck) && (hal_gpio_pin14 == pinmiso) && (hal_gpio_pin15 == pinmosi) && (hal_gpio_pin13 == pinsck))
        {   // PB13, PB14, PB15
            afname = HAL_GPIO_AFNAME_NONE;
            afmode = HAL_GPIO_AFMODE_NONE;
            found = hal_true;
        }
    }
    else if(hal_spi3 == id)
    {
        if((hal_gpio_portB == portsck) && (hal_gpio_pin3 == pinsck) && (hal_gpio_portB == portmiso) && (hal_gpio_pin4 == pinmiso) && (hal_gpio_portB == portmosi) && (hal_gpio_pin5 == pinmosi))
        {   // PB3, PB4, PB5
            afname = HAL_GPIO_AFNAME_NONE;
            afmode = HAL_GPIO_AFMODE_NONE;
            found = hal_true;
        }
        else if((hal_gpio_portC == portsck) && (hal_gpio_pin10 == pinsck) && (hal_gpio_portC == portmiso) && (hal_gpio_pin11 == pinmiso) && (hal_gpio_portC == portmosi) && (hal_gpio_pin12 == pinmosi))
        {   // PC10, PC11, PC12
            afname = GPIO_Remap_SPI3;
            afmode = ENABLE;
            found = hal_true;
        }
    }

    if(hal_false == found)
    {
        hal_base_on_fatalerror(hal_fatalerror_incorrectparameter, "hal_spi_init(): incorrect pin mapping");
    }

    hal_gpio_altcfg_t hal_spi_sck_altcfg;
    hal_gpio_altcfg_t hal_spi_miso_altcfg;
    hal_gpio_altcfg_t hal_spi_mosi_altcfg;
    hal_gpio_cfg_t config;

    // prepare the altcfg for sck, miso, mosi pins
    if(hal_spi_ownership_master == ownership)
    {
        memcpy(&hal_spi_sck_altcfg, &s_hal_spi_sckmosi_master_altcfg, sizeof(hal_gpio_altcfg_t));
        memcpy(&hal_spi_miso_altcfg, &s_hal_spi_miso_master_altcfg, sizeof(hal_gpio_altcfg_t));
        memcpy(&hal_spi_mosi_altcfg, &s_hal_spi_sckmosi_master_altcfg, sizeof(hal_gpio_altcfg_t));
    }
    else
    {
        memcpy(&hal_spi_sck_altcfg, &s_hal_spi_sckmosi_slave_altcfg, sizeof(hal_gpio_altcfg_t));
        memcpy(&hal_spi_miso_altcfg, &s_hal_spi_miso_slave_altcfg, sizeof(hal_gpio_altcfg_t));
        memcpy(&hal_spi_mosi_altcfg, &s_hal_spi_sckmosi_slave_altcfg, sizeof(hal_gpio_altcfg_t));
    }

    hal_spi_sck_altcfg.afname = hal_spi_miso_altcfg.afname = hal_spi_mosi_altcfg.afname = afname;
    hal_spi_sck_altcfg.afname = hal_spi_miso_altcfg.afmode = hal_spi_mosi_altcfg.afmode = afmode;

    // configure miso, mosi, sck pins
    memcpy(&config, &hal_brdcfg_spi__theconfig.gpio_sck[HAL_spi_id2index(id)].config, sizeof(hal_gpio_cfg_t));
    config.altcfg = &hal_spi_sck_altcfg;
    hal_gpio_init(hal_brdcfg_spi__theconfig.gpio_sck[HAL_spi_id2index(id)].gpio, &config);

    memcpy(&config, &hal_brdcfg_spi__theconfig.gpio_miso[HAL_spi_id2index(id)].config, sizeof(hal_gpio_cfg_t));
    config.altcfg = &hal_spi_miso_altcfg;
    hal_gpio_init(hal_brdcfg_spi__theconfig.gpio_miso[HAL_spi_id2index(id)].gpio, &config);

    memcpy(&config, &hal_brdcfg_spi__theconfig.gpio_mosi[HAL_spi_id2index(id)].config, sizeof(hal_gpio_cfg_t));
    config.altcfg = &hal_spi_mosi_altcfg;
    hal_gpio_init(hal_brdcfg_spi__theconfig.gpio_mosi[HAL_spi_id2index(id)].gpio, &config);

//     hal_gpio_configure(hal_brdcfg_spi__theconfig.gpio_sck[HAL_spi_id2index(id)], &hal_spi_sck_altcfg);
//     hal_gpio_configure(hal_brdcfg_spi__theconfig.gpio_miso[HAL_spi_id2index(id)], &hal_spi_miso_altcfg);
//     hal_gpio_configure(hal_brdcfg_spi__theconfig.gpio_mosi[HAL_spi_id2index(id)], &hal_spi_mosi_altcfg);


#elif   defined(HAL_USE_CPU_FAM_STM32F4)

    static const GPIO_InitTypeDef  s_hal_spi_misomosisck_altcfg  =
    {
        .GPIO_Pin       = 0,
        .GPIO_Mode      = GPIO_Mode_AF,
        .GPIO_Speed     = GPIO_Speed_50MHz,
        .GPIO_OType     = GPIO_OType_PP,
        .GPIO_PuPd      = GPIO_PuPd_DOWN
    };


    // 1. prepare af.
    // for spi1 (sck, miso, mosi): sck -> PA5, PB3.         miso -> PA6, PB4.           mosi -> PA7, PB5.
    // for spi2 (sck, miso, mosi): sck -> PB10, PB13, PI1.  miso -> PAB14, PC2, PI2.    mosi -> PB15, PC3, PI3.
    // for spi3 (sck, miso, mosi): sck -> PB3, PC10.        miso -> PB4, PC11.          mosi -> PB5, PC12.

    uint32_t afname = HAL_GPIO_AFNAME_NONE;
    uint32_t afmode = HAL_GPIO_AFMODE_NONE;
    hal_bool_t foundsck  = hal_false;
    hal_bool_t foundmiso = hal_false;
    hal_bool_t foundmosi = hal_false;


    hal_gpio_port_t portsck  = hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].sck.gpio.port;
    hal_gpio_pin_t  pinsck   = hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].sck.gpio.pin;
    hal_gpio_port_t portmiso = hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].miso.gpio.port;
    hal_gpio_pin_t  pinmiso  = hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].miso.gpio.pin;
    hal_gpio_port_t portmosi = hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].mosi.gpio.port;
    hal_gpio_pin_t  pinmosi  = hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].mosi.gpio.pin;


    if(hal_spi1 == id)
    {
        afname = GPIO_AF_SPI1;
        afmode = ENABLE;

        if( ((hal_gpio_portA == portsck) && (hal_gpio_pin5 == pinsck))  ||
                ((hal_gpio_portB == portsck) && (hal_gpio_pin3 == pinsck))  )
        {   // PA5, PB3
            foundsck = hal_true;
        }

        if( ((hal_gpio_portA == portmiso) && (hal_gpio_pin6 == pinmiso))  ||
                ((hal_gpio_portB == portmiso) && (hal_gpio_pin4 == pinmiso))  )
        {   // PA6, PB4
            foundmiso = hal_true;
        }

        if( ((hal_gpio_portA == portmosi) && (hal_gpio_pin7 == pinmosi))  ||
                ((hal_gpio_portB == portmosi) && (hal_gpio_pin5 == pinmosi))  )
        {   // PA7, PB5
            foundmosi = hal_true;
        }

    }
    else if(hal_spi2 == id)
    {
        afname = GPIO_AF_SPI2;
        afmode = ENABLE;

        if( ((hal_gpio_portB == portsck) && (hal_gpio_pin10 == pinsck))  ||
                ((hal_gpio_portB == portsck) && (hal_gpio_pin13 == pinsck))  ||
                ((hal_gpio_portI == portsck) && (hal_gpio_pin1 == pinsck)) )
        {   // PB10, PB13, PI1
            foundsck = hal_true;
        }

        if( ((hal_gpio_portB == portmiso) && (hal_gpio_pin14 == pinmiso))  ||
                ((hal_gpio_portC == portmiso) && (hal_gpio_pin2 == pinmiso))  ||
                ((hal_gpio_portI == portmiso) && (hal_gpio_pin2 == pinmiso)) )
        {   // PAB14, PC2, PI2
            foundmiso = hal_true;
        }

        if( ((hal_gpio_portB == portmosi) && (hal_gpio_pin15 == pinmosi))  ||
                ((hal_gpio_portC == portmosi) && (hal_gpio_pin3 == pinmosi))  ||
                ((hal_gpio_portI == portmosi) && (hal_gpio_pin3 == pinmosi)) )
        {   // PB15, PC3, PI3
            foundmosi = hal_true;
        }

    }
    else if(hal_spi3 == id)
    {
        afname = GPIO_AF_SPI3;
        afmode = ENABLE;

        if( ((hal_gpio_portB == portsck) && (hal_gpio_pin3 == pinsck))  ||
                ((hal_gpio_portC == portsck) && (hal_gpio_pin10 == pinsck))  )
        {   // PB3, PC10
            foundsck = hal_true;
        }

        if( ((hal_gpio_portB == portmiso) && (hal_gpio_pin4 == pinmiso))  ||
                ((hal_gpio_portC == portmiso) && (hal_gpio_pin11 == pinmiso))  )
        {   // PB4, PC11
            foundmiso = hal_true;
        }

        if( ((hal_gpio_portB == portmosi) && (hal_gpio_pin5 == pinmosi))  ||
                ((hal_gpio_portC == portmosi) && (hal_gpio_pin12 == pinmosi))  )
        {   // PB5, PC12
            foundmosi = hal_true;
        }

    }

    if((hal_false == foundsck) || (hal_false == foundmiso) || (hal_false == foundmosi))
    {
        hal_base_on_fatalerror(hal_fatalerror_incorrectparameter, "hal_spi_init(): incorrect pin mapping");
    }


    hal_gpio_cfg_t hal_spi_sck_cfg;
    hal_gpio_cfg_t hal_spi_miso_cfg;
    hal_gpio_cfg_t hal_spi_mosi_cfg;
    hal_gpio_altcfg_t hal_spi_sck_altcfg;
    hal_gpio_altcfg_t hal_spi_miso_altcfg;
    hal_gpio_altcfg_t hal_spi_mosi_altcfg;


    // prepare the altcfg for sck miso mosi pins
    memcpy(&hal_spi_sck_altcfg.gpioext, &s_hal_spi_misomosisck_altcfg, sizeof(GPIO_InitTypeDef));
    memcpy(&hal_spi_miso_altcfg.gpioext, &s_hal_spi_misomosisck_altcfg, sizeof(GPIO_InitTypeDef));
    memcpy(&hal_spi_mosi_altcfg.gpioext, &s_hal_spi_misomosisck_altcfg, sizeof(GPIO_InitTypeDef));
    hal_spi_sck_altcfg.afname = hal_spi_miso_altcfg.afname = hal_spi_mosi_altcfg.afname = afname;
    hal_spi_sck_altcfg.afmode = hal_spi_miso_altcfg.afmode = hal_spi_mosi_altcfg.afmode = afmode;

    // the gpiocfgs.
    hal_spi_sck_cfg.dir     = hal_gpio_dirALT;
    hal_spi_sck_cfg.speed   = hal_gpio_speed_default;
    hal_spi_sck_cfg.altcfg  = &hal_spi_sck_altcfg;
    hal_spi_miso_cfg.dir    = hal_gpio_dirALT;
    hal_spi_miso_cfg.speed  = hal_gpio_speed_default;
    hal_spi_miso_cfg.altcfg = &hal_spi_miso_altcfg;
    hal_spi_mosi_cfg.dir    = hal_gpio_dirALT;
    hal_spi_mosi_cfg.speed  = hal_gpio_speed_default;
    hal_spi_mosi_cfg.altcfg = &hal_spi_mosi_altcfg;

    // configure sck miso mosi pins
    hal_gpio_init(hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].sck.gpio, &hal_spi_sck_cfg);
    hal_gpio_init(hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].miso.gpio, &hal_spi_miso_cfg);
    hal_gpio_init(hal_brdcfg_spi__theconfig.gpiomap[HAL_spi_id2index(id)].mosi.gpio, &hal_spi_mosi_cfg);


#else //defined(HAL_USE_CPU_FAM_*)
#error ERR --> choose a HAL_USE_CPU_FAM_*
#endif
}

static void s_hal_spi_hw_enable(hal_spi_t id, const hal_spi_cfg_t* cfg)
{
#if     defined(HAL_USE_CPU_FAM_STM32F1) || defined(HAL_USE_CPU_FAM_STM32F4)

    SPI_TypeDef* SPIx = HAL_spi_id2stmSPI(id);
    uint16_t prescaler_stm32fx = 0;
    SPI_InitTypeDef spi_cfg;


    SPI_I2S_DeInit(SPIx);

    memcpy(&spi_cfg, &s_hal_spi_stm32_cfg, sizeof(SPI_InitTypeDef));
    // apply the mode
    spi_cfg.SPI_Mode                = (hal_spi_ownership_master == cfg->ownership) ? (SPI_Mode_Master) : (SPI_Mode_Slave);


    // configure speed of spi ...

    if((hal_spi_speed_dontuse == cfg->speed) && (hal_spi_prescaler_dontuse == cfg->prescaler))
    {
        hal_base_on_fatalerror(hal_fatalerror_incorrectparameter, "hal_spi_init(): use one of speed or prescaler");
    }
    if((hal_spi_speed_dontuse != cfg->speed) && (hal_spi_prescaler_dontuse != cfg->prescaler))
    {
        hal_base_on_fatalerror(hal_fatalerror_incorrectparameter, "hal_spi_init(): use either speed or prescaler, not both");
    }

    if(hal_spi_prescaler_dontuse != cfg->prescaler)
    {   // ok, we have the prescaler. need only to convert it in stm32fx format

        switch(cfg->prescaler)
        {   // remember that hal_spi_prescaler_xxx is referred to high speed bus,
        // and prescaler_stm32fx to high speed bus for spi1 but to low speed for spi2 and spi3
        case hal_spi_prescaler_004:
        {
            prescaler_stm32fx = (hal_spi1 == id) ? SPI_BaudRatePrescaler_4 : SPI_BaudRatePrescaler_2;
        }
        break;
        case hal_spi_prescaler_008:
        {
            prescaler_stm32fx = (hal_spi1 == id) ? SPI_BaudRatePrescaler_8 : SPI_BaudRatePrescaler_4;
        }
        break;
        case hal_spi_prescaler_016:
        {
            prescaler_stm32fx = (hal_spi1 == id) ? SPI_BaudRatePrescaler_16 : SPI_BaudRatePrescaler_8;
        }
        break;
        case hal_spi_prescaler_032:
        {
            prescaler_stm32fx = (hal_spi1 == id) ? SPI_BaudRatePrescaler_32 : SPI_BaudRatePrescaler_16;
        }
        break;
        case hal_spi_prescaler_064:
        {
            prescaler_stm32fx = (hal_spi1 == id) ? SPI_BaudRatePrescaler_64 : SPI_BaudRatePrescaler_32;
        }
        break;
        case hal_spi_prescaler_128:
        {
            prescaler_stm32fx = (hal_spi1 == id) ? SPI_BaudRatePrescaler_128 : SPI_BaudRatePrescaler_64;
        }
        break;
        case hal_spi_prescaler_256:
        {
            prescaler_stm32fx = (hal_spi1 == id) ? SPI_BaudRatePrescaler_256 : SPI_BaudRatePrescaler_128;
        }
        break;
        default:
        {
            prescaler_stm32fx = SPI_BaudRatePrescaler_256;
        }
        break;
        }
    }
    else if(hal_spi_speed_dontuse != cfg->speed)
    {   // ok, use the speed to compute the prescaler in stm32fx format

        // remember that hal_spi_prescaler_xxx is referred to high speed bus,
        // and prescaler_stm32fx to high speed bus for spi1 but to low speed for spi2 and spi3
        uint16_t factor = (hal_spi1 == id) ? (hal_brdcfg_cpu__theconfig.speeds.fastbus / cfg->speed) : (hal_brdcfg_cpu__theconfig.speeds.slowbus / cfg->speed);

        switch(factor)
        {
        case 2:
            prescaler_stm32fx = SPI_BaudRatePrescaler_2;
            break;
        case 4:
            prescaler_stm32fx = SPI_BaudRatePrescaler_4;
            break;
        case 8:
            prescaler_stm32fx = SPI_BaudRatePrescaler_8;
            break;
        case 16:
            prescaler_stm32fx = SPI_BaudRatePrescaler_16;
            break;
        case 32:
            prescaler_stm32fx = SPI_BaudRatePrescaler_32;
            break;
        case 64:
            prescaler_stm32fx = SPI_BaudRatePrescaler_64;
            break;
        case 128:
            prescaler_stm32fx = SPI_BaudRatePrescaler_128;
            break;
        case 256:
            prescaler_stm32fx = SPI_BaudRatePrescaler_256;
            break;
        default:
            prescaler_stm32fx = SPI_BaudRatePrescaler_256;
            break;
        }

    }

    // ok ... we have prescaler_stm32fx at last.
    spi_cfg.SPI_BaudRatePrescaler = prescaler_stm32fx;

    // can init spi
    SPI_Init(SPIx, &spi_cfg);

    if(hal_spi_act_framebased == cfg->activity)
    {
        // enable dma rx request
        SPI_I2S_DMACmd(SPIx, SPI_I2S_DMAReq_Rx, ENABLE);
        // enable dma tx request
        SPI_I2S_DMACmd(SPIx, SPI_I2S_DMAReq_Tx, ENABLE);
    }

#else //defined(HAL_USE_CPU_FAM_*)
#error ERR --> choose a HAL_USE_CPU_FAM_*
#endif
}




static hal_result_t s_hal_spi_timeoutexpired(void)
{
    hal_base_on_fatalerror(hal_fatalerror_incorrectparameter, "timeout error in spi raw operations");
    return(hal_res_NOK_generic);
}

#if 0
static void s_hal_spi_scheduling_suspend(void)
{
    hal_base_osal_scheduling_suspend();
}

static void s_hal_spi_scheduling_restart(void)
{
    hal_base_osal_scheduling_restart();
}
#endif

static hal_result_t s_hal_spi_put(hal_spi_t id, uint8_t* txframe)
{
    hal_result_t res = hal_res_NOK_generic;
    hal_spi_internal_item_t* intitem = s_hal_spi_theinternals.items[HAL_spi_id2index(id)];
    hal_spi_cfg_t* cfg = &intitem->config;


    if(hal_spi_act_framebased != cfg->activity)
    {
        return(hal_res_NOK_generic);
    }

    if(hal_spi_dir_rxonly != cfg->direction)
    {
        // disable so that we can change a data structure which is used by the isr

        hal_bool_t dmaisenabled = s_hal_spi_is_dma_enabled(id);
        if(hal_true == dmaisenabled)
        {
            s_hal_spi_periph_dma_isr_disable(id);
        }

        res =  hal_utility_fifo_put(&intitem->fifotx, txframe);

        if(hal_true == dmaisenabled)
        {
            s_hal_spi_periph_dma_isr_enable(id);
        }
    }

//    if(hal_true == sendnow)
//    {
//        // enable again
//        s_hal_spi_periph_dma_enable(id);
//    }

    return(res);
}

static hal_result_t s_hal_spi_get(hal_spi_t id, uint8_t* rxframe, uint8_t* remainingrxframes)
{
    hal_result_t res = hal_res_NOK_generic;
    hal_spi_internal_item_t* intitem = s_hal_spi_theinternals.items[HAL_spi_id2index(id)];
    hal_spi_cfg_t* cfg = &intitem->config;


    if(hal_spi_act_framebased != cfg->activity)
    {
        return(hal_res_NOK_generic);
    }

    if(hal_spi_dir_txonly != intitem->config.direction)
    {

        hal_bool_t dmaisenabled = s_hal_spi_is_dma_enabled(id);
        if(hal_true == dmaisenabled)
        {
            s_hal_spi_periph_dma_isr_disable(id);
        }

        res =  hal_utility_fifo_get(&intitem->fiforx, rxframe, remainingrxframes);

        if(hal_true == dmaisenabled)
        {
            s_hal_spi_periph_dma_isr_enable(id);
        }
    }


//    if(NULL != size)
//    {
//        *size = (hal_res_OK == res) ? (s_hal_spi_internals[HAL_spi_id2index(id)].config.sizeofframe) : (0);
//    }

    // enable again
//        s_hal_spi_isr_enable(id);

    return(res);
}


static void s_hal_spi_periph_dma_isr_enable(hal_spi_t id)
{
    hal_dma_isr_enable(s_hal_spi_dma_port2use_rx[HAL_spi_id2index(id)]);
    hal_dma_isr_enable(s_hal_spi_dma_port2use_tx[HAL_spi_id2index(id)]);
}
/**
 * gpio irq init
 * 
 * Initialize an external interrupt on a gpio pin 
 * 
 * @param pin       Pin number to enable gpio.
 * @param handler   Interrupt handler
 * @param arg       Argument to pass to interrupt handler
 * @param trig      Trigger mode of interrupt
 * @param pull      Push/pull mode of input.
 * 
 * @return int 
 */
int
gpio_irq_init(int pin, gpio_irq_handler_t handler, void *arg,
              gpio_irq_trig_t trig, gpio_pull_t pull)
{
    int rc;
    int irqn;
    int index;
    uint32_t pin_mask;
    uint32_t mode;
    GPIO_InitTypeDef init_cfg;

    /* Configure the gpio for an external interrupt */
    rc = 0;
    switch (trig) {
    case GPIO_TRIG_NONE:
        rc = -1;
        break;
    case GPIO_TRIG_RISING:
        mode = GPIO_MODE_IT_RISING;
        break;
    case GPIO_TRIG_FALLING:
        mode = GPIO_MODE_IT_FALLING;
        break;
    case GPIO_TRIG_BOTH:
        mode = GPIO_MODE_IT_RISING_FALLING;
        break;
    case GPIO_TRIG_LOW:
        rc = -1;
        break;
    case GPIO_TRIG_HIGH:
        rc = -1;
        break;
    default:
        rc = -1;
        break;
    }

    /* Check to make sure no error has occurred */
    if (!rc) {
        /* Disable interrupt and clear any pending */
        gpio_irq_disable(pin);
        pin_mask = GPIO_MASK(pin);
        __HAL_GPIO_EXTI_CLEAR_FLAG(pin_mask);

        /* Set the gpio irq handler */
        index = GPIO_INDEX(pin);
        gpio_irq_handlers[index].isr = handler;
        gpio_irq_handlers[index].arg = arg;

        /* Configure the GPIO */
        init_cfg.Mode = mode;
        init_cfg.Pull = pull;
        rc = hal_gpio_init(pin, &init_cfg);
        if (!rc) {
            /* Enable interrupt vector in NVIC */
            irqn = hal_gpio_pin_to_irq(pin);
            hal_gpio_set_nvic(irqn);
        }
    }

    return rc;
}
示例#21
0
 static hal_result_t s_hal_brdcfg_device_eeprom__wp_init(void)
 {
     const hal_gpio_map_t* map = &hal_brdcfg_device_eeprom__gpiomapof_wp;
     return(hal_gpio_init(map->gpio, &map->config));
 }