[flashrom] [PATCH] serprog: add opcode to control the programmer's output drivers.

Stefan Tauner stefan.tauner at student.tuwien.ac.at
Wed Oct 10 08:08:36 CEST 2012


Also, move the macro list to its own file.

Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>
---
Implemented and tested with my atmegaXXu2 flasher, works great with my
coreboot target. Does anybody have an idea for a better macro name?
Maybe just S_CMD_S_DRIVERS?

 Documentation/serprog-protocol.txt |   33 +++++++---------------------
 serprog.c                          |   42 +++++++++++++++---------------------
 serprog.h                          |   25 +++++++++++++++++++++
 3 files changed, 50 insertions(+), 50 deletions(-)
 create mode 100644 serprog.h

diff --git a/Documentation/serprog-protocol.txt b/Documentation/serprog-protocol.txt
index d8733cc..58f4417 100644
--- a/Documentation/serprog-protocol.txt
+++ b/Documentation/serprog-protocol.txt
@@ -34,6 +34,7 @@ COMMAND	Description			Parameters			Return Value
 0x13	Perform SPI operation		24-bit slen + 24-bit rlen	ACK + rlen bytes of data / NAK
 					 + slen bytes of data
 0x14	Set SPI clock frequency in Hz	32-bit requested frequency	ACK + 32-bit set frequency / NAK
+0x15	Toggle flash chip pin drivers	8-bit (0 disable, else enable)	ACK / NAK
 0x??	unimplemented command - invalid.
 
 
@@ -82,6 +83,12 @@ Additional information of the above commands:
 		lower than the one requested. If there is no lower frequency
 		available the lowest possible should be used. The value
 		chosen is sent back in the reply with an ACK.
+	0x15 (S_CMD_S_PIN_STATE):
+		Sets the state of the pin drivers connected to the flash chip. Disabling them allows other
+		devices (e.g. a mainboard's chipset) to access the chip. This way the serprog controller can
+		remain attached to the flash chip even when the board is running. The user is responsible to
+		NOT connect VCC and other permanently externally driven signals to the programmer as needed.
+		If the value is 0, then the drivers should be disabled, otherwise they should be enabled.
 	About mandatory commands:
 		The only truly mandatory commands for any device are 0x00, 0x01, 0x02 and 0x10,
 		but one can't really do anything with these commands.
@@ -92,28 +99,4 @@ Additional information of the above commands:
 		In addition, support for these commands is recommended:
 		S_CMD_Q_PGMNAME, S_CMD_Q_BUSTYPE, S_CMD_Q_CHIPSIZE (if parallel).
 
-
-This define listing should help C coders - (it's here to be the single source for copying - will be a .h someday i think)
-#define S_ACK 0x06
-#define S_NAK 0x15
-#define S_CMD_NOP		0x00            /* No operation                                 */
-#define S_CMD_Q_IFACE           0x01            /* Query interface version                      */
-#define S_CMD_Q_CMDMAP		0x02		/* Query supported commands bitmap		*/
-#define S_CMD_Q_PGMNAME         0x03            /* Query programmer name                        */
-#define S_CMD_Q_SERBUF          0x04            /* Query Serial Buffer Size                     */
-#define S_CMD_Q_BUSTYPE         0x05            /* Query supported bustypes                     */
-#define S_CMD_Q_CHIPSIZE        0x06            /* Query supported chipsize (2^n format)        */
-#define S_CMD_Q_OPBUF           0x07            /* Query operation buffer size                  */
-#define S_CMD_Q_WRNMAXLEN	0x08		/* Query Write to opbuf: Write-N maximum length */
-#define S_CMD_R_BYTE            0x09            /* Read a single byte                           */
-#define S_CMD_R_NBYTES          0x0A            /* Read n bytes                                 */
-#define S_CMD_O_INIT            0x0B            /* Initialize operation buffer                  */
-#define S_CMD_O_WRITEB          0x0C            /* Write opbuf: Write byte with address         */
-#define S_CMD_O_WRITEN		0x0D		/* Write to opbuf: Write-N			*/
-#define S_CMD_O_DELAY           0x0E            /* Write opbuf: udelay                          */
-#define S_CMD_O_EXEC            0x0F            /* Execute operation buffer                     */
-#define S_CMD_SYNCNOP		0x10		/* Special no-operation that returns NAK+ACK	*/
-#define S_CMD_Q_RDNMAXLEN	0x11		/* Query read-n maximum length			*/
-#define S_CMD_S_BUSTYPE		0x12		/* Set used bustype(s).				*/
-#define S_CMD_O_SPIOP		0x13		/* Perform SPI operation.			*/
-#define S_CMD_S_SPI_FREQ	0x14		/* Set SPI clock frequency */
+See also serprog.h.
diff --git a/serprog.c b/serprog.c
index b179ea4..0f31696 100644
--- a/serprog.c
+++ b/serprog.c
@@ -38,6 +38,7 @@
 #include "flash.h"
 #include "programmer.h"
 #include "chipdrivers.h"
+#include "serprog.h"
 
 #define MSGHEADER "serprog: "
 
@@ -48,30 +49,6 @@
  */
 static int serprog_shutdown(void *data);
 
-#define S_ACK 0x06
-#define S_NAK 0x15
-#define S_CMD_NOP		0x00	/* No operation                                 */
-#define S_CMD_Q_IFACE		0x01	/* Query interface version                      */
-#define S_CMD_Q_CMDMAP		0x02	/* Query supported commands bitmap              */
-#define S_CMD_Q_PGMNAME		0x03	/* Query programmer name                        */
-#define S_CMD_Q_SERBUF		0x04	/* Query Serial Buffer Size                     */
-#define S_CMD_Q_BUSTYPE		0x05	/* Query supported bustypes                     */
-#define S_CMD_Q_CHIPSIZE	0x06	/* Query supported chipsize (2^n format)        */
-#define S_CMD_Q_OPBUF		0x07	/* Query operation buffer size                  */
-#define S_CMD_Q_WRNMAXLEN	0x08	/* Query opbuf-write-N maximum length           */
-#define S_CMD_R_BYTE		0x09	/* Read a single byte                           */
-#define S_CMD_R_NBYTES		0x0A	/* Read n bytes                                 */
-#define S_CMD_O_INIT		0x0B	/* Initialize operation buffer                  */
-#define S_CMD_O_WRITEB		0x0C	/* Write opbuf: Write byte with address         */
-#define S_CMD_O_WRITEN		0x0D	/* Write to opbuf: Write-N                      */
-#define S_CMD_O_DELAY		0x0E	/* Write opbuf: udelay                          */
-#define S_CMD_O_EXEC		0x0F	/* Execute operation buffer                     */
-#define S_CMD_SYNCNOP		0x10	/* Special no-operation that returns NAK+ACK    */
-#define S_CMD_Q_RDNMAXLEN	0x11	/* Query read-n maximum length			*/
-#define S_CMD_S_BUSTYPE		0x12	/* Set used bustype(s).				*/
-#define S_CMD_O_SPIOP		0x13	/* Perform SPI operation.			*/
-#define S_CMD_S_SPI_FREQ	0x14	/* Set SPI clock frequency			*/
-
 static uint16_t sp_device_serbuf_size = 16;
 static uint16_t sp_device_opbuf_size = 300;
 /* Bitmap of supported commands */
@@ -687,6 +664,15 @@ int serprog_init(void)
 			 sp_device_opbuf_size);
   	}
 
+	if (sp_check_commandavail(S_CMD_S_PIN_STATE)) {
+		uint8_t en = 1;
+		if (sp_docommand(S_CMD_S_PIN_STATE, 1, &en, 0, NULL) != 0) {
+			msg_perr("Error: could not enable output buffers\n");
+			return 1;
+		} else
+			msg_pdbg(MSGHEADER "Output drivers enabled\n");
+	} else
+		msg_pdbg(MSGHEADER "Warning: Programmer does not support toggling its output drivers\n");
 	sp_prev_was_write = 0;
 	sp_streamed_transmit_ops = 0;
 	sp_streamed_transmit_bytes = 0;
@@ -759,9 +745,15 @@ static void sp_execute_opbuf(void)
 
 static int serprog_shutdown(void *data)
 {
-	msg_pspew("%s\n", __func__);
 	if ((sp_opbuf_usage) || (sp_max_write_n && sp_write_n_bytes))
 		sp_execute_opbuf();
+	if (sp_check_commandavail(S_CMD_S_PIN_STATE)) {
+		uint8_t dis = 0;
+		if (sp_docommand(S_CMD_S_PIN_STATE, 1, &dis, 0, NULL) == 0)
+			msg_pdbg(MSGHEADER "Output drivers disabled\n");
+		else
+			msg_perr(MSGHEADER "%s: Warning: could not disable output buffers\n", __func__);
+	}
 	/* FIXME: fix sockets on windows(?), especially closing */
 	serialport_shutdown(&sp_fd);
 	if (sp_max_write_n)
diff --git a/serprog.h b/serprog.h
new file mode 100644
index 0000000..b54aaea
--- /dev/null
+++ b/serprog.h
@@ -0,0 +1,25 @@
+/* According to Serial Flasher Protocol Specification - version 1 */
+#define S_ACK 0x06
+#define S_NAK 0x15
+#define S_CMD_NOP		0x00	/* No operation					*/
+#define S_CMD_Q_IFACE		0x01	/* Query interface version			*/
+#define S_CMD_Q_CMDMAP		0x02	/* Query supported commands bitmap		*/
+#define S_CMD_Q_PGMNAME		0x03	/* Query programmer name			*/
+#define S_CMD_Q_SERBUF		0x04	/* Query Serial Buffer Size			*/
+#define S_CMD_Q_BUSTYPE		0x05	/* Query supported bustypes			*/
+#define S_CMD_Q_CHIPSIZE	0x06	/* Query supported chipsize (2^n format)	*/
+#define S_CMD_Q_OPBUF		0x07	/* Query operation buffer size			*/
+#define S_CMD_Q_WRNMAXLEN	0x08	/* Query Write to opbuf: Write-N maximum length */
+#define S_CMD_R_BYTE		0x09	/* Read a single byte				*/
+#define S_CMD_R_NBYTES		0x0A	/* Read n bytes					*/
+#define S_CMD_O_INIT		0x0B	/* Initialize operation buffer			*/
+#define S_CMD_O_WRITEB		0x0C	/* Write opbuf: Write byte with address		*/
+#define S_CMD_O_WRITEN		0x0D	/* Write to opbuf: Write-N			*/
+#define S_CMD_O_DELAY		0x0E	/* Write opbuf: udelay				*/
+#define S_CMD_O_EXEC		0x0F	/* Execute operation buffer			*/
+#define S_CMD_SYNCNOP		0x10	/* Special no-operation that returns NAK+ACK	*/
+#define S_CMD_Q_RDNMAXLEN	0x11	/* Query read-n maximum length			*/
+#define S_CMD_S_BUSTYPE		0x12	/* Set used bustype(s).				*/
+#define S_CMD_O_SPIOP		0x13	/* Perform SPI operation.			*/
+#define S_CMD_S_SPI_FREQ	0x14	/* Set SPI clock frequency			*/
+#define S_CMD_S_PIN_STATE	0x15	/* Enable/disable output drivers		*/
-- 
Kind regards, Stefan Tauner





More information about the flashrom mailing list