Hi, The Beagle BSP from Ben Gras has only enabled the UART0 for console. Since I need another available UART; I wrote the code and I successfully enabled the UART1 (Rx pin: P9_26 and Tx pin: P9_24) for the Beaglebone Black. Attached you will find the patch code for this. If you have any questions, please let me know. Thanks and regards, Eduardo.-
Eduardo Sanchez Software Engineer Taller Technologies Argentina San Lorenzo 47, 3rd floor, Office 9 Cordoba, Argentina Phone: +54 351 4217888 / +54 351 4218211 Skype: sanchez.taller
diff --git a/c/src/lib/libbsp/arm/beagle/console/console-config.c b/c/src/lib/libbsp/arm/beagle/console/console-config.c index 63c7ba7..b773d76 100644 --- a/c/src/lib/libbsp/arm/beagle/console/console-config.c +++ b/c/src/lib/libbsp/arm/beagle/console/console-config.c @@ -32,37 +32,127 @@ #define CONSOLE_UART_THR (*(volatile unsigned int *)BSP_CONSOLE_UART_BASE) #define CONSOLE_UART_RHR (*(volatile unsigned int *)BSP_CONSOLE_UART_BASE) -#define CONSOLE_UART_LSR (*(volatile unsigned int *)(BSP_CONSOLE_UART_BASE+0x14)) -#define CONSOLE_SYSC (*(volatile uint32_t *) (BSP_CONSOLE_UART_BASE + 0x54)) -#define CONSOLE_SYSS (*(volatile uint32_t *) (BSP_CONSOLE_UART_BASE + 0x58)) +#define CONSOLE_SYSC (*(volatile uint32_t *) (BSP_CONSOLE_UART_BASE + BEAGLE_UART_SYSC)) +#define CONSOLE_SYSS (*(volatile uint32_t *) (BSP_CONSOLE_UART_BASE + BEAGLE_UART_SYSS)) #define TX_FIFO_E (1<<5) #define RX_FIFO_E (1<<0) -static uint8_t beagle_uart_get_register(uintptr_t addr, uint8_t i) +static bool beagle_uart2_probe(int minor); /* Prototype for warning suppression */ + +static uint8_t beagle_uart_get_register(uintptr_t addr, uint8_t offset) { - uint8_t v; - volatile uint32_t *reg_r = (volatile uint32_t *) addr + i; + volatile uint32_t *reg = (volatile uint32_t *) addr; - if(reg_r == (uint32_t*) BSP_CONSOLE_UART_BASE /* reading RHR */ ) { - /* check there should be anything in the RHR before accessing it */ - if(!(CONSOLE_UART_LSR & 0x01)) { - return 0; - } - } + return (uint8_t) reg [offset]; +} - v = (uint8_t) *reg_r; +static void beagle_uart_set_register(uintptr_t addr, uint8_t offset, uint8_t val) +{ + volatile uint32_t *reg = (volatile uint32_t *) addr; - return v; + reg [offset] = val; } -static void beagle_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val) +#if IS_AM335X + +/** + * @brief Enable clock for UART 2 module + * Use when enabling UART2 in BeagleBone Black. +*/ + +static void beagle_uart2_enable_module(void) +{ + /* * * * * * * * * * * * * * * * * * * */ + /* Enabling clock for UART2 Module */ + /* * * * * * * * * * * * * * * * * * * */ + + /* Writing to MODULEMODE field of CM_PER_UART2_CLKCTRL register. */ + REG(CM_PER_BASE + BEAGLE_CM_PER_UART2_CLKCTRL) |= + CM_MODULEMODE_ENABLE; + + /* Waiting for MODULEMODE field to reflect the written value. */ + while(CM_MODULEMODE_ENABLE != + (REG(CM_PER_BASE + BEAGLE_CM_PER_UART2_CLKCTRL) & + CM_MODULEMODE_MASK)); +} + +/** + * @brief Change GPIO pins to UART (Rx and Tx) + * Use when enabling UART2 in BeagleBone Black. +*/ + +static void beagle_uart2_pinmux(void) +{ + /* * * * * * * * * * * * * * * * * * * */ + /* Set pinmux for UART2 */ + /* * * * * * * * * * * * * * * * * * * */ + + /* RXD Pin: select pull-up and set pin as rx active */ + REG(BEAGLE_CONTROL_MODULE_BASE_REG + BEAGLE_CONF_UART2_RXD) = + (BEAGLE_CONF_UART2_RXD_PUTYPESEL | + BEAGLE_CONF_UART2_RXD_RXACTIVE); + + /* TXD Pin: select pull-up */ + REG(BEAGLE_CONTROL_MODULE_BASE_REG + BEAGLE_CONF_UART2_TXD) = + BEAGLE_CONF_UART2_TXD_PUTYPESEL; +} + +/** + * @brief Reset module + * Use when enabling UART2 in BeagleBone Black. +*/ + +static void beagle_uart2_reset_module(void) +{ + /* Performing Software Reset of the module. */ + REG(BEAGLE_BASE_UART_2 + BEAGLE_UART_SYSC) |= (BEAGLE_UART_SYSC_SOFTRESET); + + /* Wait until the process of Module Reset is complete. */ + while(!(REG(BEAGLE_BASE_UART_2 + BEAGLE_UART_SYSS) & BEAGLE_UART_SYSS_RESETDONE)); + +} + +/** + * @brief Switch operating mode to "UART16x" + * Use when enabling UART2 in BeagleBone Black. +*/ + +static void beagle_uart2_UART16x_operating_mode(void) +{ + /* Clearing the MODESELECT field in MDR1. */ + + REG(BEAGLE_BASE_UART_2 + BEAGLE_UART_MDR1) &= ~(BEAGLE_UART_MDR1_MODE_SELECT); + /* Programming the MODESELECT field in MDR1. */ + REG(BEAGLE_BASE_UART_2 + BEAGLE_UART_MDR1) |= (BEAGLE_UART16x_OPER_MODE & BEAGLE_UART_MDR1_MODE_SELECT); + +} + +/** + * @brief Enable UART2 in BeagleBone Black. + * Enable clock, pin setup, reset module and set operating mode. +*/ + +static bool beagle_uart2_probe(int minor) { - volatile uint32_t *reg = (volatile uint32_t *) addr; - reg [i] = val; + /* Enabling clock for UART2 Module */ + beagle_uart2_enable_module(); + + /* Set pinmux for UART2 */ + beagle_uart2_pinmux(); + + /* Reset UART Module */ + beagle_uart2_reset_module(); + + /* Switch to UART16x operating mode. */ + beagle_uart2_UART16x_operating_mode(); + + return true; } +#endif + console_tbl Console_Configuration_Ports [] = { { .sDeviceName = "/dev/ttyS0", @@ -72,6 +162,7 @@ console_tbl Console_Configuration_Ports [] = { #else .pDeviceFns = &ns16550_fns, #endif + .deviceProbe = NULL, .ulMargin = 16, .ulHysteresis = 8, .pDeviceParams = (void *) CONSOLE_BAUD, @@ -82,9 +173,35 @@ console_tbl Console_Configuration_Ports [] = { .setRegister = beagle_uart_set_register, .ulClock = UART_CLOCK, /* 48MHz base clock */ }, + +#if IS_AM335X + { + .sDeviceName = "/dev/ttyS1", + .deviceType = SERIAL_NS16550, +#if CONSOLE_POLLED /* option to facilitate running the tests */ + .pDeviceFns = &ns16550_fns_polled, +#else /* ELSE: UART will use Interrupts */ + .pDeviceFns = &ns16550_fns, +#endif + .deviceProbe = beagle_uart2_probe, + .ulMargin = 16, + .ulHysteresis = 8, + .pDeviceParams = (void *) CONSOLE_BAUD, + .ulCtrlPort1 = BEAGLE_BASE_UART_2, + .ulDataPort = BEAGLE_BASE_UART_2, + .ulIntVector = OMAP3_UART2_IRQ, + .getRegister = beagle_uart_get_register, + .setRegister = beagle_uart_set_register, + .ulClock = UART_CLOCK, /* 48MHz base clock */ + }, +#endif + }; -unsigned long Console_Configuration_Count = 1; +#define BEAGLE_UART_COUNT ( sizeof( Console_Configuration_Ports ) \ + / sizeof( Console_Configuration_Ports[ 0 ] ) ) + +unsigned long Console_Configuration_Count = BEAGLE_UART_COUNT; static int init_needed = 1; // don't rely on bss being 0 diff --git a/c/src/lib/libbsp/arm/beagle/include/bsp.h b/c/src/lib/libbsp/arm/beagle/include/bsp.h index e235efa..e839058 100644 --- a/c/src/lib/libbsp/arm/beagle/include/bsp.h +++ b/c/src/lib/libbsp/arm/beagle/include/bsp.h @@ -155,12 +155,26 @@ static inline void flush_data_cache(void) /* per-target uart config */ #if IS_AM335X -#define BSP_CONSOLE_UART 1 -#define BSP_CONSOLE_UART_BASE BEAGLE_BASE_UART_1 -#define BSP_CONSOLE_UART_IRQ OMAP3_UART1_IRQ -#define BEAGLE_BASE_UART_1 0x44E09000 -#define BEAGLE_BASE_UART_2 0x48022000 -#define BEAGLE_BASE_UART_3 0x48024000 +#define BSP_CONSOLE_UART 1 +#define BSP_CONSOLE_UART_BASE BEAGLE_BASE_UART_1 +#define BSP_CONSOLE_UART_IRQ OMAP3_UART1_IRQ +#define BEAGLE_BASE_UART_1 0x44E09000 +#define BEAGLE_BASE_UART_2 0x48022000 +#define BEAGLE_BASE_UART_3 0x48024000 +#define BEAGLE_UART_SYSS 0x58 +#define BEAGLE_UART_SYSC 0x54 +#define BEAGLE_UART_SYSC_SOFTRESET 0x00000002u +#define BEAGLE_UART_SYSS_RESETDONE 0x00000001u +#define BEAGLE_UART16x_OPER_MODE 0x0u +#define BEAGLE_UART_MDR1 0x20 +#define BEAGLE_UART_MDR1_MODE_SELECT 0x00000007u +#define BEAGLE_CM_PER_UART2_CLKCTRL 0x6c +#define BEAGLE_CONTROL_MODULE_BASE_REG 0x44E10000 +#define BEAGLE_CONF_UART2_RXD 0x980 +#define BEAGLE_CONF_UART2_TXD 0x984 +#define BEAGLE_CONF_UART2_TXD_PUTYPESEL 0x00000010u +#define BEAGLE_CONF_UART2_RXD_RXACTIVE 0x00000020u +#define BEAGLE_CONF_UART2_RXD_PUTYPESEL 0x00000010u #endif /* per-target uart config */
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel