|
@@ -52,6 +52,8 @@ struct imx_serial {
|
|
|
volatile uint32_t uts;
|
|
|
};
|
|
|
|
|
|
+DECLARE_GLOBAL_DATA_PTR;
|
|
|
+
|
|
|
void serial_setbrg (void)
|
|
|
{
|
|
|
serial_init();
|
|
@@ -67,6 +69,9 @@ extern void imx_gpio_mode(int gpio_mode);
|
|
|
int serial_init (void)
|
|
|
{
|
|
|
volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
|
|
|
+ unsigned int ufcr_rfdiv;
|
|
|
+ unsigned int refclk;
|
|
|
+
|
|
|
#ifdef CONFIG_IMX_SERIAL1
|
|
|
imx_gpio_mode(PC11_PF_UART1_TXD);
|
|
|
imx_gpio_mode(PC12_PF_UART1_RXD);
|
|
@@ -95,11 +100,33 @@ int serial_init (void)
|
|
|
/* Configure FIFOs */
|
|
|
base->ufcr = 0xa81;
|
|
|
|
|
|
+ /* set the baud rate.
|
|
|
+ *
|
|
|
+ * baud * 16 x
|
|
|
+ * --------- = -
|
|
|
+ * refclk y
|
|
|
+ *
|
|
|
+ * x - 1 = UBIR
|
|
|
+ * y - 1 = UBMR
|
|
|
+ *
|
|
|
+ * each register is 16 bits wide. refclk max is 96 MHz
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
+ ufcr_rfdiv = ((base->ufcr) & UFCR_RFDIV) >> 7;
|
|
|
+ if (ufcr_rfdiv == 6)
|
|
|
+ ufcr_rfdiv = 7;
|
|
|
+ else
|
|
|
+ ufcr_rfdiv = 6 - ufcr_rfdiv;
|
|
|
+
|
|
|
+ refclk = get_PERCLK1();
|
|
|
+ refclk /= ufcr_rfdiv;
|
|
|
+
|
|
|
/* Set the numerator value minus one of the BRM ratio */
|
|
|
- base->ubir = (CONFIG_BAUDRATE / 100) - 1;
|
|
|
+ base->ubir = (gd->baudrate / 100) - 1;
|
|
|
|
|
|
/* Set the denominator value minus one of the BRM ratio */
|
|
|
- base->ubmr = 10000 - 1;
|
|
|
+ base->ubmr = (refclk/(16 * 100)) - 1;
|
|
|
|
|
|
/* Set to 8N1 */
|
|
|
base->ucr2 &= ~UCR2_PREN;
|
|
@@ -117,22 +144,21 @@ int serial_init (void)
|
|
|
|
|
|
/* Clear status flags */
|
|
|
base->usr2 |= USR2_ADET |
|
|
|
- USR2_DTRF |
|
|
|
- USR2_IDLE |
|
|
|
- USR2_IRINT |
|
|
|
- USR2_WAKE |
|
|
|
- USR2_RTSF |
|
|
|
- USR2_BRCD |
|
|
|
- USR2_ORE |
|
|
|
- USR2_RDR;
|
|
|
+ USR2_DTRF |
|
|
|
+ USR2_IDLE |
|
|
|
+ USR2_IRINT |
|
|
|
+ USR2_WAKE |
|
|
|
+ USR2_RTSF |
|
|
|
+ USR2_BRCD |
|
|
|
+ USR2_ORE;
|
|
|
|
|
|
/* Clear status flags */
|
|
|
base->usr1 |= USR1_PARITYERR |
|
|
|
- USR1_RTSD |
|
|
|
- USR1_ESCF |
|
|
|
- USR1_FRAMERR |
|
|
|
- USR1_AIRINT |
|
|
|
- USR1_AWAKE;
|
|
|
+ USR1_RTSD |
|
|
|
+ USR1_ESCF |
|
|
|
+ USR1_FRAMERR |
|
|
|
+ USR1_AIRINT |
|
|
|
+ USR1_AWAKE;
|
|
|
return (0);
|
|
|
}
|
|
|
|