svn commit: r253914 - head/sys/arm/freescale/imx

Ian Lepore ian at FreeBSD.org
Sat Aug 3 13:31:10 UTC 2013


Author: ian
Date: Sat Aug  3 13:31:10 2013
New Revision: 253914
URL: http://svnweb.freebsd.org/changeset/base/253914

Log:
  Tweak the imx debug console code so that it works with multiple SoCs.
  
  Instead of hard-coding the uart register addresses for the imx51, use
  a variable that defaults to the imx51 address.  When debugging another
  imx-family SoC, the variable can be set early in initarm() to provide
  full console/printf support for debugging early boot.

Modified:
  head/sys/arm/freescale/imx/console.c

Modified: head/sys/arm/freescale/imx/console.c
==============================================================================
--- head/sys/arm/freescale/imx/console.c	Sat Aug  3 12:45:00 2013	(r253913)
+++ head/sys/arm/freescale/imx/console.c	Sat Aug  3 13:31:10 2013	(r253914)
@@ -41,46 +41,57 @@ __FBSDID("$FreeBSD$");
 
 /* Allow it to be predefined, to be able to use another UART for console */
 #ifndef	IMX_UART_BASE
-#define	IMX_UART_BASE	0xe3fbc000 /* UART1 */
+#define	IMX_UART_BASE	0xe3fbc000 /* imx51 UART1 */
 #endif
 
-#define	IMX_RXD			(u_int32_t *)(IMX_UART_BASE + 0x00)
-#define	IMX_TXD			(u_int32_t *)(IMX_UART_BASE + 0x40)
+#define	IMX_RXD			0x00
+#define	IMX_TXD			0x40
 
-#define	IMX_UFCR		(u_int32_t *)(IMX_UART_BASE + 0x90)
-#define	IMX_USR1		(u_int32_t *)(IMX_UART_BASE + 0x94)
+#define	IMX_UFCR		0x90
+#define	IMX_USR1		0x94
 #define	IMX_USR1_TRDY		(1 << 13)
 
-#define	IMX_USR2		(u_int32_t *)(IMX_UART_BASE + 0x98)
+#define	IMX_USR2		0x98
 #define	IMX_USR2_RDR		(1 << 0)
 #define	IMX_USR2_TXFE		(1 << 14)
 #define	IMX_USR2_TXDC		(1 << 3)
 
-#define	IMX_UTS			(u_int32_t *)(IMX_UART_BASE + 0xb4)
+#define	IMX_UTS			0xb4
 #define	IMX_UTS_TXFULL		(1 << 4)
 
 /*
+ * The base address of the uart registers.
+ *
+ * This is global so that it can be changed on the fly from the outside.  For
+ * example, set imx_uart_base=physaddr and then call cninit() as the first two
+ * lines of initarm() and enjoy printf() availability through the tricky bits of
+ * startup.  After initarm() switches from physical to virtual addressing, just
+ * set imx_uart_base=virtaddr and printf keeps working.
+ */
+uint32_t imx_uart_base = IMX_UART_BASE;
+
+/*
  * uart related funcs
  */
-static u_int32_t
-uart_getreg(u_int32_t *bas)
+static uint32_t
+ub_getreg(uint32_t off)
 {
 
-	return *((volatile u_int32_t *)(bas)) & 0xff;
+	return *((volatile uint32_t *)(imx_uart_base + off));
 }
 
 static void
-uart_setreg(u_int32_t *bas, u_int32_t val)
+ub_setreg(uint32_t off, uint32_t val)
 {
 
-	*((volatile u_int32_t *)(bas)) = (u_int32_t)val;
+	*((volatile uint32_t *)(imx_uart_base + off)) = val;
 }
 
 static int
 ub_tstc(void)
 {
 
-	return ((uart_getreg(IMX_USR2) & IMX_USR2_RDR) ? 1 : 0);
+	return ((ub_getreg(IMX_USR2) & IMX_USR2_RDR) ? 1 : 0);
 }
 
 static int
@@ -90,7 +101,7 @@ ub_getc(void)
 	while (!ub_tstc());
 		__asm __volatile("nop");
 
-	return (uart_getreg(IMX_RXD) & 0xff);
+	return (ub_getreg(IMX_RXD) & 0xff);
 }
 
 static void
@@ -100,10 +111,10 @@ ub_putc(unsigned char c)
 	if (c == '\n')
 		ub_putc('\r');
 
-	while (uart_getreg(IMX_UTS) & IMX_UTS_TXFULL)
+	while (ub_getreg(IMX_UTS) & IMX_UTS_TXFULL)
 		__asm __volatile("nop");
 
-	uart_setreg(IMX_TXD, c);
+	ub_setreg(IMX_TXD, c);
 }
 
 static cn_probe_t	uart_cnprobe;
@@ -138,17 +149,19 @@ uart_cnprobe(struct consdev *cp)
 static void
 uart_cninit(struct consdev *cp)
 {
-	uart_setreg(IMX_UFCR, 0x00004210);
+
+        /* Init fifo trigger levels to 32 bytes, refclock div to 2. */
+	ub_setreg(IMX_UFCR, 0x00004210);
 }
 
-void
+static void
 uart_cnputc(struct consdev *cp, int c)
 {
 
 	ub_putc(c);
 }
 
-int
+static int
 uart_cngetc(struct consdev * cp)
 {
 


More information about the svn-src-head mailing list