Hi John Paul,
Am 02.02.21 um 20:12 schrieb John Paul Morrison:
I'm just starting to look at fashrom to see how to read/update SPI flash on a PCIe card
lspci -d 1106:3483 01:00.0 USB controller: VIA Technologies, Inc. VL805 USB 3.0 Host Controller (rev 01)
There isn't much from Via but the chipset is used in the Raspberry Pi 4 and the Pi firmware provides a flash tool vl805 (no source code of course!)
I have a working flashrom driver for that host controller, but I need testers. Back when I wrote the driver at the end of 2019 I didn't even have a Raspberry Pi 4 and was just reverse engineering the behaviour from traces with some help from clever on IRC.
I can run it on Intel with Qemu - unfortunately for me the tool is hard coded for a different SPI flash chip (and in later Pi hardware seems to have been moved/removed)
Inspecting the board and related datasheets (VL800) the chipset has an SPI interface for firmware, and it can be used for PCI BIOS apparently. The actual SPI chip varies from board to board - mine is FM25Q04 from the data sheet ID=A112. Raspberry Pi seems to use W25X10BV based on the ID EF10
Are there any simple examples of accessing SPI on PCIe cards?
sorry for the long post - I've included a bit more info on what I could find on the chip
Thanks.
I really should update the VL805 patch against current flashrom and submit it.
thanks
John Paul
Regards, Carl-Daniel
Other info on the chip:
I can read the firmware version easily:
sudo lspci -d 1106:3483 -xxx | awk '/^50:/ { print "VL805 FW version: " $5 $4 $3 $2 }'
I can use strace to see what vl805 doing - I can make out some SPI commands - here it reads the SPI flash chip ID: openat(AT_FDCWD, "/sys/bus/pci/devices/0000:01:00.0/config", O_RDWR) = 4 (bunch of reads/writes) pread64(4, "\22\241\22\241", 4, 124) = 4 write(1, "R Rx_REG0 a112a112\n", 19) = 19
sudo ~/vl805/vl805 -d VL805 FW version: 00013600 W CHIP_SEL 00000001 R PCI_WB_EN ffffffff W PCI_WB_EN ffffff01 R STOP_POLLING 00000001 W STOP_POLLING 00000001 W CTRL_REG 000005a0 W CLK_DIV 0000000a W CHIP_SEL 00000000 W Tx_REG0 90000000 W CTRL_REG 000005c0 R Rx_REG0 a112a112 W CHIP_SEL 00000001
- flash ID mismatch - found a112, expected 0000ef10
I was able to find a Windows based firmware updater which supports about 20 different SPI chips - people have reported adding new chipsets, looks like I have to add mine as well. The flash tool runs under wine but it can't read anything - will have to find a fix or run in a vm.
Via SpiFlash.ini: [MX25L512] FlashID=C22010 ReadID=9F WriteEnable=06 WriteStatus=01 ChipErase=60 ReadData=03 ReadStatus=05 PageProgram=02 ClockRate=32 PageSize=100
Raspberry Pi 4 ? [W25X10BV] FlashID=EF10 ReadID=90000000 WriteEnable=06 WriteStatus=01 ChipErase=C7 ReadData=03 ReadStatus=05 PageProgram=02 ClockRate=32 PageSize=10