diff options
| author | hathach <[email protected]> | 2021-11-08 16:41:08 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2021-11-08 16:41:29 +0700 |
| commit | 6fea50f735d00dff23d958eec8cf4a386282c193 (patch) | |
| tree | e90af676f1f0e8e9f4321cc9aba2991a32842ac0 /hw | |
| parent | 91646d039c7dac8e16042c42c2d7197034111aeb (diff) | |
musb work well with tm4c123
Diffstat (limited to 'hw')
| -rw-r--r-- | hw/bsp/ek-tm4c123gxl/board.mk | 1 | ||||
| -rw-r--r-- | hw/bsp/ek-tm4c123gxl/tm4c123gxl.c | 173 |
2 files changed, 94 insertions, 80 deletions
diff --git a/hw/bsp/ek-tm4c123gxl/board.mk b/hw/bsp/ek-tm4c123gxl/board.mk index 368e79f4e..9d0d67e1c 100644 --- a/hw/bsp/ek-tm4c123gxl/board.mk +++ b/hw/bsp/ek-tm4c123gxl/board.mk @@ -25,6 +25,7 @@ INC += \ $(TOP)/hw/bsp SRC_C += \ + src/portable/mentor/musb/dcd_musb.c \ $(MCU_DIR)/Source/system_TM4C123.c \ $(MCU_DIR)/Source/GCC/tm4c123_startup.c diff --git a/hw/bsp/ek-tm4c123gxl/tm4c123gxl.c b/hw/bsp/ek-tm4c123gxl/tm4c123gxl.c index b370b7577..663fbf127 100644 --- a/hw/bsp/ek-tm4c123gxl/tm4c123gxl.c +++ b/hw/bsp/ek-tm4c123gxl/tm4c123gxl.c @@ -15,143 +15,156 @@ #define LED_PIN_GREEN 3 #define LED_STATE_ON 1 -static void board_uart_init(void) +//--------------------------------------------------------------------+ +// Forward USB interrupt events to TinyUSB IRQ Handler +//--------------------------------------------------------------------+ +void USB0_Handler(void) { - SYSCTL->RCGCUART |= (1<<0); // Enable the clock to UART0 - SYSCTL->RCGCGPIO |= (1<<0); // Enable the clock to GPIOA + tud_int_handler(0); +} + +//--------------------------------------------------------------------+ +// MACRO TYPEDEF CONSTANT ENUM +//--------------------------------------------------------------------+ - GPIOA->AFSEL |= (1<<1)|(1<<0); // Enable the alternate function on pin PA0 & PA1 - GPIOA->PCTL |= (1<<0)|(1<<4); // Configure the GPIOPCTL register to select UART0 in PA0 and PA1 - GPIOA->DEN |= (1<<0)|(1<<1); // Enable the digital functionality in PA0 and PA1 +static void board_uart_init (void) +{ + SYSCTL->RCGCUART |= (1 << 0); // Enable the clock to UART0 + SYSCTL->RCGCGPIO |= (1 << 0); // Enable the clock to GPIOA - /** BAUDRATE = 9600 bits per second, refer manual for calculation **/ + GPIOA->AFSEL |= (1 << 1) | (1 << 0); // Enable the alternate function on pin PA0 & PA1 + GPIOA->PCTL |= (1 << 0) | (1 << 4); // Configure the GPIOPCTL register to select UART0 in PA0 and PA1 + GPIOA->DEN |= (1 << 0) | (1 << 1); // Enable the digital functionality in PA0 and PA1 - UART0->CTL &= ~(1<<0); // Disable UART0 by clearing UARTEN bit in the UARTCTL register - UART0->IBRD = 325; // Write the integer portion of the BRD to the UARTIRD register - UART0->FBRD = 33; // Write the fractional portion of the BRD to the UARTFBRD registerer + /** BAUDRATE = 9600 bits per second, refer manual for calculation **/ + UART0->CTL &= ~(1 << 0); // Disable UART0 by clearing UARTEN bit in the UARTCTL register + UART0->IBRD = 325; // Write the integer portion of the BRD to the UARTIRD register + UART0->FBRD = 33; // Write the fractional portion of the BRD to the UARTFBRD registerer - UART0->LCRH = (0x3<<5); // 8-bit, no parity, 1 stop bit - UART0->CC = 0x0; // Configure the UART clock source as system clock + UART0->LCRH = (0x3 << 5); // 8-bit, no parity, 1 stop bit + UART0->CC = 0x0; // Configure the UART clock source as system clock - UART0->CTL = (1<<0)|(1<<8)|(1<<9); // UART0 Enable, Transmit Enable, Recieve Enable + UART0->CTL = (1 << 0) | (1 << 8) | (1 << 9); // UART0 Enable, Transmit Enable, Recieve Enable } -static void initialize_board_led(GPIOA_Type* port, uint8_t PinMsk, uint8_t dirmsk) +static void initialize_board_led (GPIOA_Type *port, uint8_t PinMsk, uint8_t dirmsk) { - /* Enable PortF Clock */ - SYSCTL -> RCGCGPIO |= (1<<5) ; + /* Enable PortF Clock */ + SYSCTL->RCGCGPIO |= (1 << 5); - /* Let the clock stabilize */ - while(! ((SYSCTL->PRGPIO) & (1<<5)) ) ; + /* Let the clock stabilize */ + while ( !((SYSCTL->PRGPIO) & (1 << 5)) ) + ; - /* Port Digital Enable */ - port->DEN |= PinMsk; + /* Port Digital Enable */ + port->DEN |= PinMsk; - /* Set direction */ - port->DIR = dirmsk ; + /* Set direction */ + port->DIR = dirmsk; } -static void board_switch_init(void) +static void board_switch_init (void) { - GPIOF->DIR &= ~(1<<BOARD_BTN); - GPIOF->PUR |= (1<<BOARD_BTN); - GPIOF->DEN |= (1<<BOARD_BTN); + GPIOF->DIR &= ~(1 << BOARD_BTN); + GPIOF->PUR |= (1 << BOARD_BTN); + GPIOF->DEN |= (1 << BOARD_BTN); } -static void WriteGPIOPin(GPIOA_Type* port, uint8_t PinMsk, bool state) +static void WriteGPIOPin (GPIOA_Type *port, uint8_t PinMsk, bool state) { - if(state) - port->DATA |= PinMsk; - else - port->DATA &= ~(PinMsk); + if ( state ) + port->DATA |= PinMsk; + else + port->DATA &= ~(PinMsk); } -static uint32_t ReadGPIOPin(GPIOA_Type *port, uint8_t pinMsk) +static uint32_t ReadGPIOPin (GPIOA_Type *port, uint8_t pinMsk) { - return (port -> DATA & pinMsk) ; + return (port->DATA & pinMsk); } -void board_init(void) +void board_init (void) { - SystemCoreClockUpdate(); - + SystemCoreClockUpdate(); + #if CFG_TUSB_OS == OPT_OS_NONE - // 1ms tick timer - SysTick_Config(SystemCoreClock / 1000); + // 1ms tick timer + SysTick_Config(SystemCoreClock / 1000); #elif CFG_TUSB_OS == OPT_OS_FREERTOS // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher ) NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ); #endif - /* Reset USB */ - SYSCTL->SRCR2 |= (1u<<16); + /* Reset USB */ + SYSCTL->SRCR2 |= (1u << 16); + + for ( volatile uint8_t i = 0; i < 20; i++ ) {} - for (volatile uint8_t i=0; i<20; i++); + SYSCTL->SRCR2 &= ~(1u << 16); - SYSCTL->SRCR2 &= ~(1u<<16); + /* Open the USB clock gate */ + SYSCTL->RCGCUSB |= (1 << 0); - /* Open the USB clock gate */ - SYSCTL->RCGCUSB |= (1<<0); + /* Power-up USB PLL */ + SYSCTL->RCC2 &= ~(1u << 14); - /* Power-up USB PLL */ - SYSCTL->RCC2 &= ~(1u<<14); + /* USB IO Initialization */ + SYSCTL->RCGCGPIO |= (1u << 3); - /* USB IO Initialization */ - SYSCTL->RCGCGPIO |= (1u<<3); - - /* Let the clock stabilize */ - while(!(SYSCTL->PRGPIO & (1u<<3))); + /* Let the clock stabilize */ + while ( !(SYSCTL->PRGPIO & (1u << 3)) ) + ; - /* USB IOs to Analog Mode */ - GPIOD->AFSEL &= ~ ( (1u<<4) | (1u<<5) ); - GPIOD->DEN &= ~ ( (1u<<4) | (1u<<5) ); - GPIOD->AMSEL |= ( (1u<<4) | (1u<<5) ); + /* USB IOs to Analog Mode */ + GPIOD->AFSEL &= ~((1u << 4) | (1u << 5)); + GPIOD->DEN &= ~((1u << 4) | (1u << 5)); + GPIOD->AMSEL |= ((1u << 4) | (1u << 5)); - uint8_t leds = (1<<LED_PIN_RED) | (1<<LED_PIN_BLUE) | (1<<LED_PIN_GREEN) ; - uint8_t dirmsk = (1<<LED_PIN_RED) | (1<<LED_PIN_BLUE) | (1<<LED_PIN_GREEN) ; + uint8_t leds = (1 << LED_PIN_RED) | (1 << LED_PIN_BLUE) | (1 << LED_PIN_GREEN); + uint8_t dirmsk = (1 << LED_PIN_RED) | (1 << LED_PIN_BLUE) | (1 << LED_PIN_GREEN); - /* Configure GPIO for board LED */ - initialize_board_led(LED_PORT,leds, dirmsk); + /* Configure GPIO for board LED */ + initialize_board_led(LED_PORT, leds, dirmsk); - /* Configure GPIO for board switch */ - board_switch_init(); + /* Configure GPIO for board switch */ + board_switch_init(); - /* Initialize board UART */ - board_uart_init(); + /* Initialize board UART */ + board_uart_init(); } -void board_led_write(bool state) +void board_led_write (bool state) { - WriteGPIOPin(LED_PORT, (1<<LED_PIN_BLUE), state); + WriteGPIOPin(LED_PORT, (1 << LED_PIN_BLUE), state); } -uint32_t board_button_read(void) +uint32_t board_button_read (void) { - uint32_t gpio_value = ReadGPIOPin(BOARD_BTN_PORT, BOARD_BTN_Msk); - return BUTTON_STATE_ACTIVE ? gpio_value : !gpio_value; + uint32_t gpio_value = ReadGPIOPin(BOARD_BTN_PORT, BOARD_BTN_Msk); + return BUTTON_STATE_ACTIVE ? gpio_value : !gpio_value; } -int board_uart_write(void const* buf, int len) +int board_uart_write (void const *buf, int len) { - uint8_t const* data = buf; + uint8_t const * data = buf; - for(int i=0; i<len; i++) - { - while((UART0->FR &(1<<5)) != 0); // Poll until previous data was shofted out - UART0->DR= data[i]; // Write UART0 DATA REGISTER - } + for ( int i = 0; i < len; i++ ) + { + while ( (UART0->FR & (1 << 5)) != 0 ) {} // Poll until previous data was shofted out + UART0->DR = data[i]; // Write UART0 DATA REGISTER + } - return len; + return len; } -int board_uart_read(uint8_t* buf, int len) +int board_uart_read (uint8_t *buf, int len) { - (void) buf; (void) len; + (void) buf; + (void) len; return 0; } - #if CFG_TUSB_OS == OPT_OS_NONE volatile uint32_t system_ticks = 0; void SysTick_Handler (void) @@ -159,7 +172,7 @@ void SysTick_Handler (void) system_ticks++; } -uint32_t board_millis(void) +uint32_t board_millis (void) { return system_ticks; } |
