예제 #1
0
/*
 * Updates LEDs to whatever is currently in car_led_x_x when called.
 */
void CAR_LED_update()
{
	//CS/RCLK low
	gpio_set_pin_state(port_E, pin_19, 0);
	
	uc_spi_send(spi_0, car_led_2_3);
	uc_spi_send(spi_0, car_led_0_1);

	//CS/RCLK back up, yo
	gpio_set_pin_state(port_E, pin_19, 1);	
}
예제 #2
0
/*
 *  Initializes LED GPIOs.
 */
void CAR_LED_init()
{
	//CS/RCLK
	gpio_port_init(port_E, pin_19, alt_1, output);
	gpio_set_pin_state(port_E, pin_19, 1);
	//output enable
	gpio_port_init(port_B, pin_3, alt_1, output);
	gpio_set_pin_state(port_B, pin_3, 0);
	//clear and reset
	gpio_port_init(port_B, pin_2, alt_1, output);
	gpio_set_pin_state(port_B, pin_2, 0);
	gpio_set_pin_state(port_B, pin_2, 1);
	
	CAR_LED_set_color(car_led_0, car_led_off);
	CAR_LED_set_color(car_led_1, car_led_off);
	CAR_LED_set_color(car_led_2, car_led_off);
	CAR_LED_set_color(car_led_3, car_led_off);
	CAR_LED_update();
}
예제 #3
0
파일: ipmi_oem.c 프로젝트: lnls-dig/openMMC
/** @brief Handler for IPMI_OEM_CMD_GPIO IPMI command
 *
 * Access and configure the controller's GPIO
 *
 * Req data:
 * [0] - Mode - (0) = Read port status (direction and value)
 *              (1) = Set pin as input
 *              (2) = Set pin as output (pin value is on byte 3)
 * [1] - GPIO Port number
 * [2] - GPIO Pin number
 * [3] - Output pin value (optional)
 *
 * @param req[in]
 * @param rsp[out]
 *
 * @return
 */
IPMI_HANDLER(ipmi_oem_cmd_gpio_pin, NETFN_CUSTOM_OEM, IPMI_OEM_CMD_GPIO_PIN, ipmi_msg *req, ipmi_msg* rsp)
{
    uint8_t mode = req->data[0];
    uint8_t port = req->data[1];
    uint8_t pin = req->data[2];
    uint8_t pin_state;

    uint8_t len = 0;

    rsp->completion_code = IPMI_CC_OK;

    switch (mode) {
    case 0:
        /* Port read, returns port direction and read value*/
        rsp->data[len++] = ( gpio_get_port_dir( port ) >> 24 ) & 0xFF;
        rsp->data[len++] = ( gpio_get_port_dir( port ) >> 16 ) & 0xFF;
        rsp->data[len++] = ( gpio_get_port_dir( port ) >>  8 ) & 0xFF;
        rsp->data[len++] = ( gpio_get_port_dir( port ) >>  0 ) & 0xFF;
        rsp->data[len++] = ( gpio_read_port( port ) >> 24 ) & 0xFF;
        rsp->data[len++] = ( gpio_read_port( port ) >> 16 ) & 0xFF;
        rsp->data[len++] = ( gpio_read_port( port ) >>  8 ) & 0xFF;
        rsp->data[len++] = ( gpio_read_port( port ) >>  0 ) & 0xFF;
        break;

    case 1:
        /* Set pin as input */
        gpio_set_pin_dir( port, pin, GPIO_DIR_INPUT );
        break;

    case 2:
        /* Set pin as output */
        gpio_set_pin_dir( port, pin, GPIO_DIR_OUTPUT );

        /* If given, set the pin output value */
        if (req->data_len > 3) {
            pin_state = req->data[3];
            gpio_set_pin_state( port, pin, pin_state );
        }
        break;

    default:
        rsp->completion_code = IPMI_CC_INV_DATA_FIELD_IN_REQ;
        break;
    }

    rsp->data_len = len;
}
예제 #4
0
void ssp_init( uint8_t id, uint32_t bitrate, uint8_t frame_sz, bool master_mode, bool poll )
{
    ssp_cfg[id].polling = poll;
    ssp_cfg[id].frame_size = frame_sz;
    ssp_cfg[id].master_mode = master_mode;
    ssp_cfg[id].bitrate = bitrate;

    /* Set up clock and muxing for SSP0/1 interface */
    /* Slave Select (SSEL/FCS_B) is left as GPIO so we can send more than one byte without this pin going high (default operation of SSP interface) */

    Chip_IOCON_Init(LPC_IOCON);

    Chip_IOCON_PinMux(LPC_IOCON, ssp_pins[id].port, ssp_pins[id].sck_pin, IOCON_MODE_PULLDOWN, ssp_pins[id].sck_func);
    Chip_IOCON_PinMux(LPC_IOCON, ssp_pins[id].port, ssp_pins[id].ssel_pin, IOCON_MODE_PULLUP, ssp_pins[id].ssel_func);
    Chip_IOCON_PinMux(LPC_IOCON, ssp_pins[id].port, ssp_pins[id].mosi_pin, IOCON_MODE_INACT, ssp_pins[id].mosi_func);
    Chip_IOCON_PinMux(LPC_IOCON, ssp_pins[id].port, ssp_pins[id].miso_pin, IOCON_MODE_INACT, ssp_pins[id].miso_func);

    if (ssp_pins[id].ssel_func == 0) {
        gpio_set_pin_dir( ssp_pins[id].port, ssp_pins[id].ssel_pin, OUTPUT);
        gpio_set_pin_state( ssp_pins[id].port, ssp_pins[id].ssel_pin, HIGH);
    }

    Chip_SSP_Init(ssp_cfg[id].lpc_id);
    Chip_SSP_SetBitRate(ssp_cfg[id].lpc_id, bitrate);
    Chip_SSP_SetMaster(ssp_cfg[id].lpc_id, master_mode);
    Chip_SSP_SetFormat(ssp_cfg[id].lpc_id, (frame_sz-1), SSP_FRAMEFORMAT_SPI, SSP_CLOCK_CPHA0_CPOL0);
    Chip_SSP_Enable(ssp_cfg[id].lpc_id);

    if (!poll) {
        /* Configure interruption priority and enable it */
        NVIC_SetPriority( ssp_cfg[id].irq, configMAX_SYSCALL_INTERRUPT_PRIORITY );
        NVIC_EnableIRQ( ssp_cfg[id].irq );
    }

    if (ssp_cfg[id].lpc_id == LPC_SSP0) {
        active_SSP0 = id;
    }
}
예제 #5
0
/*! @brief Function that controls the Slave Select (SSEL) signal
 * This pin is controlled manually because the internal SSP driver resets the SSEL pin every 8 bits that are transfered
 */
void ssp_ssel_control( uint8_t id, t_ssel_state state )
{
    gpio_set_pin_state( ssp_pins[id].port, ssp_pins[id].ssel_pin, state );
}