[flashrom] [PATCH] RayeR speedups, variable port

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Wed Jul 21 13:51:05 CEST 2010


Speed up RayeR SPIPGM driver in flashrom by a factor of 2.

Allow specification of an alternate base port with
flashrom -p rayer_spi:lptport=0x278
Any port number is allowed as long as it is nonzero, below 65536 and a
multiple of four.

Untested, should work.

Martin, this one should hopefully reach the speed of SPIPGM.exe for
reads. I'll ask Idwer to provide a DOS binary for you.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Index: flashrom-bitbang_spi_rayer_faster/flashrom.8
===================================================================
--- flashrom-bitbang_spi_rayer_faster/flashrom.8	(Revision 1093)
+++ flashrom-bitbang_spi_rayer_faster/flashrom.8	(Arbeitskopie)
@@ -394,7 +394,18 @@
 (in Hz). The default is the maximum frequency of 8 MHz.
 .TP
 .BR "rayer_spi " programmer
-No parameters defined yet. More information about the hardware is available at
+The default I/O base address used for the parallel port is 0x378 and you can use
+the optional
+.B lptport
+parameter to specify an alternate base I/O address with the
+.sp
+.B "  flashrom \-p rayer_spi:lptport=portnum"
+.sp
+syntax where
+.B portnum
+is the I/O port number of your parallel port which must be a multiple of 4.
+.sp
+More information about the hardware is available at
 http://rayer.ic.cz/elektro/spipgm.htm
 .SH EXIT STATUS
 flashrom exits with 0 on success, 1 on most failures but with 2 if /dev/mem
Index: flashrom-bitbang_spi_rayer_faster/rayer_spi.c
===================================================================
--- flashrom-bitbang_spi_rayer_faster/rayer_spi.c	(Revision 1093)
+++ flashrom-bitbang_spi_rayer_faster/rayer_spi.c	(Arbeitskopie)
@@ -30,6 +30,7 @@
  */
 #if defined(__i386__) || defined(__x86_64__)
 
+#include <stdlib.h>
 #include "flash.h"
 
 /* We have two sets of pins, out and in. The numbers for both sets are
@@ -42,7 +43,7 @@
 /* Pins for slave->master direction */
 #define SPI_MISO_PIN 6
 
-static int lpt_iobase;
+static uint16_t lpt_iobase;
 
 /* FIXME: All rayer_bitbang_set_* functions could use caching of the value
  * stored at port lpt_iobase to avoid unnecessary INB. In theory, only one
@@ -50,37 +51,31 @@
  * value.
  */
 
-void rayer_bitbang_set_cs(int val)
+/* Cached value of last byte sent. */
+static uint8_t lpt_outval;
+
+static void rayer_bitbang_set_cs(int val)
 {
-	uint8_t tmp;
-
-	tmp = INB(lpt_iobase);
-	tmp &= ~(1 << SPI_CS_PIN);
-	tmp |= (val << SPI_CS_PIN);
-	OUTB(tmp, lpt_iobase);
+	lpt_outval &= ~(1 << SPI_CS_PIN);
+	lpt_outval |= (val << SPI_CS_PIN);
+	OUTB(lpt_outval, lpt_iobase);
 }
 
-void rayer_bitbang_set_sck(int val)
+static void rayer_bitbang_set_sck(int val)
 {
-	uint8_t tmp;
-
-	tmp = INB(lpt_iobase);
-	tmp &= ~(1 << SPI_SCK_PIN);
-	tmp |= (val << SPI_SCK_PIN);
-	OUTB(tmp, lpt_iobase);
+	lpt_outval &= ~(1 << SPI_SCK_PIN);
+	lpt_outval |= (val << SPI_SCK_PIN);
+	OUTB(lpt_outval, lpt_iobase);
 }
 
-void rayer_bitbang_set_mosi(int val)
+static void rayer_bitbang_set_mosi(int val)
 {
-	uint8_t tmp;
-
-	tmp = INB(lpt_iobase);
-	tmp &= ~(1 << SPI_MOSI_PIN);
-	tmp |= (val << SPI_MOSI_PIN);
-	OUTB(tmp, lpt_iobase);
+	lpt_outval &= ~(1 << SPI_MOSI_PIN);
+	lpt_outval |= (val << SPI_MOSI_PIN);
+	OUTB(lpt_outval, lpt_iobase);
 }
 
-int rayer_bitbang_get_miso(void)
+static int rayer_bitbang_get_miso(void)
 {
 	uint8_t tmp;
 
@@ -99,16 +94,49 @@
 
 int rayer_spi_init(void)
 {
-	/* Pick a default value for now. */
-	lpt_iobase = 0x378;
+	char *portpos = NULL;
 
+	/* Non-default port requested? */
+	portpos = extract_programmer_param("lptport");
+	if (portpos) {
+		char *endptr = NULL;
+		unsigned long tmp;
+		tmp = strtoul(portpos, &endptr, 0);
+		/* Port 0, port >0x1000, unaligned ports and garbage strings
+		 * are rejected.
+		 */
+		if (!tmp || (tmp >= 0x10000) || (tmp & 0x3) ||
+		    (*endptr != '\0')) {
+			/* Using ports below 0x100 is a really bad idea, and
+			 * should only be done if no port between 0x100 and
+			 * 0xfffc works due to routing issues.
+			 */
+			msg_perr("Error: lptport specified, but no valid "
+				 "port specified.\nPort must be a multiple of "
+				 "0x4 and lie between 0x100 and 0xfffc.\n");
+			free(portpos);
+			return 1;
+		} else {
+			lpt_iobase = (uint16_t)tmp;
+			msg_pinfo("Non-default I/O base requested. This will "
+				  "not change the hardware settings.\n");
+		}
+	} else {
+		/* Pick a default value for the I/O base. */
+		lpt_iobase = 0x378;
+	}
+	free(portpos);
+	
 	msg_pdbg("Using port 0x%x as I/O base for parallel port access.\n",
 		 lpt_iobase);
 
 	get_io_perms();
 
-	/* 1 usec halfperiod delay for now. */
-	if (bitbang_spi_init(&bitbang_spi_master_rayer, 1))
+	/* Get the initial value before writing to any line. */
+	lpt_outval = INB(lpt_iobase);
+
+	/* Zero halfperiod delay. */
+	if (bitbang_spi_init(&bitbang_spi_master_rayer, 0))
 		return 1;
 
 	buses_supported = CHIP_BUSTYPE_SPI;


-- 
http://www.hailfinger.org/





More information about the flashrom mailing list