/* * 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); }
/* * 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(); }
/** @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; }
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; } }
/*! @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 ); }