Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 23 Aug 2003 17:26:30 -0700 (PDT)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 36796 for review
Message-ID:  <200308240026.h7O0QUGr078114@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help

http://perforce.freebsd.org/chv.cgi?CH=36796

Change 36796 by marcel@marcel_nfs on 2003/08/23 17:25:44

	Fix DTR: The state of DTR is inverted. To set DTR we need to
	clear the DTR bit in PVR.
	While here, fix RTS as well. The documentation states that
	if SAB_MODE_RTS is set, SAB_MODE_FRTS controls the state of
	the RTS signal. This too is inverted.

Affected files ...

.. //depot/projects/uart/dev/uart/uart_dev_sab82532.c#13 edit

Differences ...

==== //depot/projects/uart/dev/uart/uart_dev_sab82532.c#13 (text+ko) ====

@@ -185,8 +185,13 @@
 	if (bas->rclk == 0)
 		bas->rclk = DEFAULT_RCLK;
 
-	/* Set all pins, except DTR pins to be inputs. */
-	uart_setreg(bas, SAB_PCR, ~(SAB_PVR_DTR_A | SAB_PVR_DTR_B));
+	/*
+	 * Set all pins, except the DTR pins (pin 1 and 2) to be inputs.
+	 * Pin 4 is magical, meaning that I don't know what it does, but
+	 * it too has to be set to output.
+	 */
+	uart_setreg(bas, SAB_PCR,
+	    ~(SAB_PVR_DTR_A|SAB_PVR_DTR_B|SAB_PVR_MAGIC));
 	uart_barrier(bas);
 	/* Disable port interrupts. */
 	uart_setreg(bas, SAB_PIM, 0xff);
@@ -196,8 +201,8 @@
 	uart_barrier(bas);
 	/* Set DTR. */
 	pvr = uart_getreg(bas, SAB_PVR);
-	pvr |= IS_CHANNEL_A(bas) ? SAB_PVR_DTR_A : SAB_PVR_DTR_B;
-	uart_setreg(bas, SAB_PVR, pvr);
+	pvr &= IS_CHANNEL_A(bas) ? ~SAB_PVR_DTR_A : ~SAB_PVR_DTR_B;
+	uart_setreg(bas, SAB_PVR, pvr | SAB_PVR_MAGIC);
 	uart_barrier(bas);
 
 	/* power down */
@@ -216,7 +221,7 @@
 	uart_barrier(bas);
 	uart_setreg(bas, SAB_CCR4, SAB_CCR4_MCK4|SAB_CCR4_EBRG|SAB_CCR4_ICD);
 	uart_barrier(bas);
-	uart_setreg(bas, SAB_MODE, SAB_MODE_RTS|SAB_MODE_FCTS|SAB_MODE_RAC);
+	uart_setreg(bas, SAB_MODE, SAB_MODE_RTS|SAB_MODE_RAC);
 	uart_barrier(bas);
 	uart_setreg(bas, SAB_RFC, SAB_RFC_DPS|SAB_RFC_RFDF|
 	    SAB_RFC_RFTH_32CHAR);
@@ -252,7 +257,7 @@
 	uint8_t pvr;
 
 	pvr = uart_getreg(bas, SAB_PVR);
-	pvr &= IS_CHANNEL_A(bas) ? ~SAB_PVR_DTR_A : ~SAB_PVR_DTR_B;
+	pvr |= IS_CHANNEL_A(bas) ? SAB_PVR_DTR_A : SAB_PVR_DTR_B;
 	uart_setreg(bas, SAB_PVR, pvr);
 	uart_barrier(bas);
 }
@@ -546,15 +551,15 @@
 	}
 	pvr = uart_getreg(bas, SAB_PVR);
 	if (sc->sc_hwsig & UART_SIG_DTR)
+		pvr &= (IS_CHANNEL_A(bas)) ? ~SAB_PVR_DTR_A : ~SAB_PVR_DTR_B;
+	else
 		pvr |= (IS_CHANNEL_A(bas)) ? SAB_PVR_DTR_A : SAB_PVR_DTR_B;
-	else
-		pvr &= (IS_CHANNEL_A(bas)) ? ~SAB_PVR_DTR_A : ~SAB_PVR_DTR_B;
 	uart_setreg(bas, SAB_PVR, pvr);
 	mode = uart_getreg(bas, SAB_MODE);
 	if (sc->sc_hwsig & UART_SIG_RTS)
-		mode |= SAB_MODE_RTS;
+		mode &= ~SAB_MODE_FRTS;
 	else
-		mode &= ~SAB_MODE_RTS;
+		mode |= SAB_MODE_FRTS;
 	uart_setreg(bas, SAB_MODE, mode);
 	uart_barrier(bas);
         if (sig & UART_SIG_DBREAK) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200308240026.h7O0QUGr078114>