/* * Set the UART's baud rate. The calculation is: * (baud * 16) / ref_freq = num/demom * * ref_freq = perclk1 / RFDIV[2:0] * BIR = num - 1 * BMR = demom - 1 * * Setting 'num' to 16 yields this equation: * demom = ref_freq / baud */ static void imx_uart_set_baud(int minor, int baud) { unsigned int perclk1; unsigned int denom; unsigned int ref_freq = 0; uint32_t fcr; perclk1 = get_perclk1_freq(); fcr = imx_uart_data[minor].regs->fcr; switch(fcr & MC9328MXL_UART_FCR_RFDIV_MASK) { case MC9328MXL_UART_FCR_RFDIV_1: ref_freq = perclk1/1; break; case MC9328MXL_UART_FCR_RFDIV_2: ref_freq = perclk1/2; break; case MC9328MXL_UART_FCR_RFDIV_3: ref_freq = perclk1/3; break; case MC9328MXL_UART_FCR_RFDIV_4: ref_freq = perclk1/4; break; case MC9328MXL_UART_FCR_RFDIV_5: ref_freq = perclk1/5; break; case MC9328MXL_UART_FCR_RFDIV_6: ref_freq = perclk1/6; break; case MC9328MXL_UART_FCR_RFDIV_7: ref_freq = perclk1/7; break; default: rtems_panic("%s:%d Unknown RFDIV: 0x%x", __FUNCTION__, __LINE__, fcr & MC9328MXL_UART_FCR_RFDIV_MASK); break; } denom = ref_freq / baud; imx_uart_data[minor].regs->bir = 0xf; imx_uart_data[minor].regs->bmr = denom; }
/* * Set up Timer 1 */ void Timer_initialize( void ) { MC9328MXL_TMR2_TCTL = (MC9328MXL_TMR_TCTL_CLKSRC_PCLK1 | MC9328MXL_TMR_TCTL_FRR | MC9328MXL_TMR_TCTL_TEN); /* set prescaler to 1 (register value + 1) */ \ MC9328MXL_TMR2_TPRER = 0; /* get freq of counter in KHz */ g_freq = get_perclk1_freq() / 1000; g_start = MC9328MXL_TMR2_TCN; }