Leonard König has uploaded this change for review. ( https://review.coreboot.org/c/flashrom/+/38725 )
Change subject: linux_spi: add configurable spimode ......................................................................
linux_spi: add configurable spimode
Signed-off-by: Leonard König leonard.r.koenig@googlemail.com Change-Id: I650cb20efd7a34c5c12bec187e25a4757388dcf8 --- M flashrom.8.tmpl M linux_spi.c 2 files changed, 40 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/flashrom refs/changes/25/38725/1
diff --git a/flashrom.8.tmpl b/flashrom.8.tmpl index aa5bcd4..1d0cff8 100644 --- a/flashrom.8.tmpl +++ b/flashrom.8.tmpl @@ -1079,6 +1079,12 @@ .sp .B " flashrom -p linux_spi:dev=/dev/spidevX.Y,spispeed=8000" .sp +Similarly, you can set the SPI mode with the optional +.B spimode +parameter. The mode can be either 0/1/2/3 from the kernel interface, ie. +SPI mode 0 meaning that (CPOL,CPHA) is (0,0), a mode of 1 meaning (0,1), a mode +of 2 (1,0) and a mode of 3 (1,1). +.sp Please note that the linux_spi driver only works on Linux. .SS .BR "mstarddc_spi " programmer diff --git a/linux_spi.c b/linux_spi.c index aa73c18..c890b12 100644 --- a/linux_spi.c +++ b/linux_spi.c @@ -73,9 +73,9 @@ { char *p, *endp, *dev; uint32_t speed_hz = 2 * 1000 * 1000; - /* FIXME: make the following configurable by CLI options. */ /* SPI mode 0 (beware this also includes: MSB first, CS active low and others */ - const uint8_t mode = SPI_MODE_0; + uint8_t mode = SPI_MODE_0; + /* FIXME: make the following configurable by CLI options. */ const uint8_t bits = 8;
p = extract_programmer_param("spispeed"); @@ -92,6 +92,38 @@ speed_hz / 1000); } free(p); + p = extract_programmer_param("spimode"); + if (p && strlen(p)) { + unsigned long x = strtoul(p, &endp, 10); + if (p == endp || x > 3 /* SPI_MODE_3 */) { + msg_perr("%s: invalid mode: %s\n", __func__, p); + free(p); + return 1; + } + switch (x) { + case 0: + mode = SPI_MODE_0; + break; + case 1: + mode = SPI_MODE_1; + break; + case 2: + mode = SPI_MODE_2; + break; + case 3: + mode = SPI_MODE_3; + break; + default: + /* unreachable */ + break; + } + } else { + msg_pinfo("Using default %"PRIu8" mode. " + "Use 'spimode' parameter to override.\n", + mode); + } + free(p); +
dev = extract_programmer_param("dev"); if (!dev || !strlen(dev)) {