In order to start further hack on MT7628 spi driver, must make the test process clear first.
I am using spidev_test.c in linux kernel for the test.
To compile it,
1. enable spidev in make menuconfig -> Kernel Modules -> SPI Support -> kmod-spi-dev
2. enable spidev_test in make menuconfig -> Utilities -> spidev_test
For firmware part, need to prepare DTS.
add this to openwrt/target/linux/ramips/dts/VOCORE2.dts:&spi0
spidev@1 { #address-cells = <1>; #size-cells = <1>; compatible = "rohm,dh2228fv"; reg = <1>; spi-max-frequency = <100000000>; };
modify one line to enable spi0 cs1 in openwrt/target/linux/ramips/dts/mt7628an.dtsi
note: this should be optional, without it still work for me, because the cs1 register is default set to cs1 already.
-pinctrl-0 = <&spi_pins>; +pinctrl-0 = <&spi_pins>, <&spi_cs1_pins>;
And we can use this way to add more SPI device by set some GPIO as CS pin. Later I will write a patch for it.
compatible = “rohm,dh2228fv” this line is necessary, without it, kernel will complain…but actually we do not care which type of device is used.
spi-max-frequency = <100000000> this line means max spi we can set upto 100MHz, I do not think its SPI can reach 100MHz. And from my test, 66MHz should be its max speed. Anyway, without DMA, even 10MHz it can not reach.
spi-mt7621.c this spi driver full duplex mode do not allow buffer size more than 16byte, we use half duplex to avoid issue when test, remove it.
static int mt7621_spi_transfer_one_message(struct spi_master *master, struct spi_message *m) { struct spi_device *spi = m->spi; /* #ifdef CONFIG_SOC_MT7620 int cs = spi->chip_select; if (cs) return mt7621_spi_transfer_full_duplex(master, m); #endif */ return mt7621_spi_transfer_half_duplex(master, m); }
OK, now we can make the firmware and start to test the origin spi driver.
call “spidev_test -D /dev/spidev0.1 -p 12345678901234567890”, works normal.