On Mon, Feb 20, 2006 at 02:37:23PM +0100, Bj?rn ?stby wrote: > Hello, > I'm messing with a mpc823e based board trying to enable the SCC3 UART. I'm > using the 2.4.25 denx linux_ppc kernel and I've got SMC1 for console and SMC2 > up and running but I'm in desperate need of another rs232 port (which is on > SCC3 on my board). > Reading quite a lot of old posts on this mailing list got me confused whether > the SCCx UART support in the kernel is ready to be used on 8xx or if there > will take a large amount of hacking to get things going (reading the header > of 8xx_io/uart.c got me wondering even more). > Current situation is that I have enabled the SCC3 UART in the kernel, set the > correct CTS, RTS and CD signal options and finally disabled the SPI which (on > my board at least) can override the UART on the third SCC port. During boot > up I get the standard output: > > >ttyS0 at 0x0280 is on SMC1 using BRG1 > >ttyS1 at 0x0380 is on SMC2 using BRG2 > >ttyS2 at 0x0200 is on SCC3 using BRG3 > > Writing to ttyS0 and ttyS1 works fine (the result pop up in the receiving > terminal) but when trying ttyS2 nothing happens. I've checked the Tx signal > and it appears as if data is sent (the signal gets noisy when starting the > write procedure). I may also add that restaring the write application causes > the kernel to hang (for ttyS2 only of course). > > I've read some posts saying that Linux don't init other uart ports than the > console port and that is the potential problem here, but it is unclear if > this statement is true or not. I can also add to the problem description that > my SMC2 port works fine for writing, but reading just hangs in the read() > call. So, can anyone confirm any status on the SMCx and SCCx UART drivers for > 2.4? please try the two attached patches. the first one configures each SCC to one BRG. the second one, makes use always of dpram memory. we're working on a decent fix. Marcelo: if you find the first one ok, you may apply it, but don't apply the second
-- Aristeu -------------- next part -------------- Index: stable/drivers/serial/cpm_uart/cpm_uart_cpm1.c =================================================================== --- stable.orig/drivers/serial/cpm_uart/cpm_uart_cpm1.c 2006-02-17 17:11:37.000000000 -0200 +++ stable/drivers/serial/cpm_uart/cpm_uart_cpm1.c 2006-02-17 17:15:57.000000000 -0200 @@ -139,24 +139,31 @@ void scc1_lineif(struct uart_cpm_port *pinfo) { /* XXX SCC1: insert port configuration here */ + cpmp->cp_sicr &= 0xFFFFFFC0; pinfo->brg = 1; } void scc2_lineif(struct uart_cpm_port *pinfo) { /* XXX SCC2: insert port configuration here */ + cpmp->cp_sicr &= 0xFFFFC0FF; + cpmp->cp_sicr |= 0x00000900; pinfo->brg = 2; } void scc3_lineif(struct uart_cpm_port *pinfo) { /* XXX SCC3: insert port configuration here */ + cpmp->cp_sicr &= 0xFFC0FFFF; + cpmp->cp_sicr |= 0x00140000; pinfo->brg = 3; } void scc4_lineif(struct uart_cpm_port *pinfo) { /* XXX SCC4: insert port configuration here */ + cpmp->cp_sicr &= 0xC0FFFFFF; + cpmp->cp_sicr |= 0x1BFFFFFF; pinfo->brg = 4; } -------------- next part -------------- Index: stable/drivers/serial/cpm_uart/cpm_uart_core.c =================================================================== --- stable.orig/drivers/serial/cpm_uart/cpm_uart_core.c 2005-12-07 15:30:42.000000000 -0200 +++ stable/drivers/serial/cpm_uart/cpm_uart_core.c 2005-12-08 12:39:11.000000000 -0200 @@ -467,6 +467,7 @@ /* free interrupt handler */ free_irq(port->irq, port); +#if 0 /* If the port is not the console, disable Rx and Tx. */ if (!(pinfo->flags & FLAG_CONSOLE)) { /* Wait for all the BDs marked sent */ @@ -492,6 +493,7 @@ /* Shut them really down */ cpm_line_cr_cmd(line, CPM_CR_STOP_TX); } +#endif } static void cpm_uart_set_termios(struct uart_port *port, @@ -896,7 +898,7 @@ pinfo->sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT); } - ret = cpm_uart_allocbuf(pinfo, 0); + ret = cpm_uart_allocbuf(pinfo, 1); if (ret) return ret; @@ -912,10 +914,12 @@ static void cpm_uart_release_port(struct uart_port *port) { +#if 0 struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; if (!(pinfo->flags & FLAG_CONSOLE)) cpm_uart_freebuf(pinfo); +#endif } /*