diff mbox series

[v2,10/10] riscv: Add support for SPI on Kendryte K210

Message ID 20200807144317.282868-11-seanga2@gmail.com
State Superseded
Delegated to: Andes
Headers show
Series riscv: Add SPI support for Kendryte K210 | expand

Commit Message

Sean Anderson Aug. 7, 2020, 2:43 p.m. UTC
This patch enables configs necessary for using SPI. It also adds some
documentation.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
---

Changes in v2:
- Add Gigadevice SPI chips to dependencies

 board/sipeed/maix/Kconfig          | 11 ++++
 configs/sipeed_maix_bitm_defconfig |  8 +++
 doc/board/sipeed/maix.rst          | 94 +++++++++++++++++++-----------
 3 files changed, 80 insertions(+), 33 deletions(-)

Comments

Heinrich Schuchardt Aug. 8, 2020, 5:48 a.m. UTC | #1
On 8/7/20 4:43 PM, Sean Anderson wrote:
> This patch enables configs necessary for using SPI. It also adds some
> documentation.
>
> Signed-off-by: Sean Anderson <seanga2@gmail.com>
> ---
>
> Changes in v2:
> - Add Gigadevice SPI chips to dependencies
>
>  board/sipeed/maix/Kconfig          | 11 ++++
>  configs/sipeed_maix_bitm_defconfig |  8 +++
>  doc/board/sipeed/maix.rst          | 94 +++++++++++++++++++-----------
>  3 files changed, 80 insertions(+), 33 deletions(-)
>
> diff --git a/board/sipeed/maix/Kconfig b/board/sipeed/maix/Kconfig
> index 4c42dd2087..48a4e9dc1a 100644
> --- a/board/sipeed/maix/Kconfig
> +++ b/board/sipeed/maix/Kconfig
> @@ -53,4 +53,15 @@ config BOARD_SPECIFIC_OPTIONS
>  	imply CMD_GPIO
>  	imply LED
>  	imply LED_GPIO
> +	imply SPI
> +	imply DESIGNWARE_SPI
> +	imply SPI_FLASH_GIGADEVICE
> +	imply SPI_FLASH_WINBOND
> +	imply DM_MTD
> +	imply SPI_FLASH_MTD
> +	imply CMD_MTD
> +	imply ENV_IS_IN_SPI_FLASH
> +	imply MMC
> +	imply MMC_BROKEN_CD
> +	imply MMC_SPI
>  endif
> diff --git a/configs/sipeed_maix_bitm_defconfig b/configs/sipeed_maix_bitm_defconfig
> index f48f7f06e9..7f644e7a37 100644
> --- a/configs/sipeed_maix_bitm_defconfig
> +++ b/configs/sipeed_maix_bitm_defconfig
> @@ -1,6 +1,14 @@
>  CONFIG_RISCV=y
> +CONFIG_ENV_SIZE=0x2000
> +CONFIG_ENV_SECT_SIZE=0x1000
> +CONFIG_ENV_OFFSET=0x7C000
> +CONFIG_ENV_OFFSET_REDUND=0x7E000
>  CONFIG_TARGET_SIPEED_MAIX=y
>  CONFIG_ARCH_RV64I=y
> +CONFIG_USE_BOOTCOMMAND=y
> +CONFIG_BOOTCOMMAND="sf probe;mtd read kernel 80000000;go 80000000"

If no kernel is present, this will let your system hang.

"go" does not check that whatever you loaded from mtd is a kernel. That
is why we have commands like bootm.

> +CONFIG_MTDIDS_DEFAULT="nor0=spi3.0"
> +CONFIG_MTDPARTS_DEFAULT="spi3.0:496k(u-boot),16k(env),5632k(kernel),10240k(data)"

The size of u-boot.bin may exceed 496 KiB depending on the options
selected. Mine is currently 543589 bytes. When starting with OpenSBI
another 70+ KiB will be needed.

If we overwrite 5632 KiB from the kernel partition, this may overwrite
the relocated U-Boot.

When an SD-card is worn out I can replace it. When the SPI flash is worn
out I have to replace the device.

We can put the kernel and the environment onto the SD card. I would
suggest to use SPI only for OpenSBI and U-Boot. Please, use
CONFIG_DISTRO_BOOT.

>  CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
>  # CONFIG_NET is not set
>  # CONFIG_INPUT is not set
> diff --git a/doc/board/sipeed/maix.rst b/doc/board/sipeed/maix.rst
> index 1865e2adfb..fa78bcd51c 100644
> --- a/doc/board/sipeed/maix.rst
> +++ b/doc/board/sipeed/maix.rst
> @@ -46,42 +46,14 @@ Boot output should look like the following:
>      U-Boot 2020.04-rc2-00087-g2221cc09c1-dirty (Feb 28 2020 - 13:53:09 -0500)
>
>      DRAM:  8 MiB
> +    MMC:   spi@53000000:slot@0: 0

Actual output is

MMC:   regs=0000000053000000 max-frequency=25000000

>      In:    serial@38000000
>      Out:   serial@38000000
>      Err:   serial@38000000

As we do not check if a kernel is available:

MTD device kernel not found, ret -19
## Starting application at 0x80000000 ...

And then hanging.

Best regards

Heinrich

> -    =>
> -
> -Loading Images
> -^^^^^^^^^^^^^^
> -
> -To load a kernel, transfer it over serial.
> -
> -.. code-block:: none
> -
> -    => loady 80000000 1500000
> -    ## Switch baudrate to 1500000 bps and press ENTER ...
> -
> -    *** baud: 1500000
> -
> -    *** baud: 1500000 ***
> -    ## Ready for binary (ymodem) download to 0x80000000 at 1500000 bps...
> -    C
> -    *** file: loader.bin
> -    $ sz -vv loader.bin
> -    Sending: loader.bin
> -    Bytes Sent:2478208   BPS:72937
> -    Sending:
> -    Ymodem sectors/kbytes sent:   0/ 0k
> -    Transfer complete
> -
> -    *** exit status: 0 ***
> -    ## Total Size      = 0x0025d052 = 2478162 Bytes
> -    ## Switch baudrate to 115200 bps and press ESC ...
> -
> -    *** baud: 115200
> -
> -    *** baud: 115200 ***
> -    =>
> +    Hit any key to stop autoboot:  0
> +    SF: Detected w25q128fw with page size 256 Bytes, erase size 4 KiB, total 16 MiB
> +    Reading 5242880 byte(s) at offset 0x00000000
> +    ## Starting application at 0x80000000 ...
>
>  Running Programs
>  ^^^^^^^^^^^^^^^^
> @@ -163,6 +135,62 @@ To run legacy images, use the ``bootm`` command:
>      argv[0] = "<NULL>"
>      Hit any key to exit ...
>
> +Flashing Images
> +---------------
> +
> +To flash a kernel, transfer it over serial, then write it to the kernel
> +partition.
> +
> +.. code-block:: none
> +
> +    => loady 80000000 1500000
> +    ## Switch baudrate to 1500000 bps and press ENTER ...
> +
> +    *** baud: 1500000
> +
> +    *** baud: 1500000 ***
> +    ## Ready for binary (ymodem) download to 0x80000000 at 1500000 bps...
> +    C
> +    *** file: loader.bin
> +    $ sz -vv loader.bin
> +    Sending: loader.bin
> +    Bytes Sent:2478208   BPS:72937
> +    Sending:
> +    Ymodem sectors/kbytes sent:   0/ 0k
> +    Transfer complete
> +
> +    *** exit status: 0 ***
> +    ## Total Size      = 0x0025d052 = 2478162 Bytes
> +    ## Switch baudrate to 115200 bps and press ESC ...
> +
> +    *** baud: 115200
> +
> +    *** baud: 115200 ***
> +    => sf probe
> +    SF: Detected w25q128fw with page size 256 Bytes, erase size 4 KiB, total 16 MiB
> +    => mtd write kernel 80000000 0 25d052
> +    Writing 2478162 byte(s) at offset 0x00000000
> +
> +Partition Scheme
> +^^^^^^^^^^^^^^^^
> +
> +There is no partition scheme specified by the manufacturer. The only requirement
> +imposed by the firmware is that offset 0 will be loaded and ran. The default
> +partition scheme is
> +
> +========= ======== ======
> +Partition Offset   Size
> +========= ======== ======
> +u-boot    0x000000 496k
> +env       0x07C000 16k
> +kernel    0x080000 5M
> +data      0x580000 10.5M
> +========= ======== ======
> +
> +**NB:** kflash adds a 5-byte header to payloads (and a 32-byte trailer) to all
> +payloads it flashes. If you use kflash to flash your payload, you will need to
> +account for this header when specifying what offset in spi flash to load from.
> +
>  Pin Assignment
>  --------------
>
>
Sean Anderson Aug. 8, 2020, 11:15 a.m. UTC | #2
On 8/8/20 1:48 AM, Heinrich Schuchardt wrote:
> On 8/7/20 4:43 PM, Sean Anderson wrote:
>> This patch enables configs necessary for using SPI. It also adds some
>> documentation.
>>
>> Signed-off-by: Sean Anderson <seanga2@gmail.com>
>> ---
>>
>> Changes in v2:
>> - Add Gigadevice SPI chips to dependencies
>>
>>  board/sipeed/maix/Kconfig          | 11 ++++
>>  configs/sipeed_maix_bitm_defconfig |  8 +++
>>  doc/board/sipeed/maix.rst          | 94 +++++++++++++++++++-----------
>>  3 files changed, 80 insertions(+), 33 deletions(-)
>>
>> diff --git a/board/sipeed/maix/Kconfig b/board/sipeed/maix/Kconfig
>> index 4c42dd2087..48a4e9dc1a 100644
>> --- a/board/sipeed/maix/Kconfig
>> +++ b/board/sipeed/maix/Kconfig
>> @@ -53,4 +53,15 @@ config BOARD_SPECIFIC_OPTIONS
>>  	imply CMD_GPIO
>>  	imply LED
>>  	imply LED_GPIO
>> +	imply SPI
>> +	imply DESIGNWARE_SPI
>> +	imply SPI_FLASH_GIGADEVICE
>> +	imply SPI_FLASH_WINBOND
>> +	imply DM_MTD
>> +	imply SPI_FLASH_MTD
>> +	imply CMD_MTD
>> +	imply ENV_IS_IN_SPI_FLASH
>> +	imply MMC
>> +	imply MMC_BROKEN_CD
>> +	imply MMC_SPI
>>  endif
>> diff --git a/configs/sipeed_maix_bitm_defconfig b/configs/sipeed_maix_bitm_defconfig
>> index f48f7f06e9..7f644e7a37 100644
>> --- a/configs/sipeed_maix_bitm_defconfig
>> +++ b/configs/sipeed_maix_bitm_defconfig
>> @@ -1,6 +1,14 @@
>>  CONFIG_RISCV=y
>> +CONFIG_ENV_SIZE=0x2000
>> +CONFIG_ENV_SECT_SIZE=0x1000
>> +CONFIG_ENV_OFFSET=0x7C000
>> +CONFIG_ENV_OFFSET_REDUND=0x7E000
>>  CONFIG_TARGET_SIPEED_MAIX=y
>>  CONFIG_ARCH_RV64I=y
>> +CONFIG_USE_BOOTCOMMAND=y
>> +CONFIG_BOOTCOMMAND="sf probe;mtd read kernel 80000000;go 80000000"
> 
> If no kernel is present, this will let your system hang.
> 
> "go" does not check that whatever you loaded from mtd is a kernel. That
> is why we have commands like bootm.

I think originally I was having problems with bootm because the *addr
variables were not set, so I used go and not bootm. I will try again
with your patch for those variables.

>> +CONFIG_MTDIDS_DEFAULT="nor0=spi3.0"
>> +CONFIG_MTDPARTS_DEFAULT="spi3.0:496k(u-boot),16k(env),5632k(kernel),10240k(data)"
> 
> The size of u-boot.bin may exceed 496 KiB depending on the options
> selected. Mine is currently 543589 bytes. When starting with OpenSBI
> another 70+ KiB will be needed.

Huh. I had only seen U-Boot with size in the 200-300M range. We can
definitely increase this. Again, this is effectively arbitrary, and I'm
still not sure if doing partitions like this is the best approach.
Perhaps we should be using UBI here? I wasn't able to figure out what
the "best practice" is for this sort of board.

> If we overwrite 5632 KiB from the kernel partition, this may overwrite
> the relocated U-Boot.
> 
> When an SD-card is worn out I can replace it. When the SPI flash is worn
> out I have to replace the device.

Yeah, I would like to be booting off the SD card here as well, but I
haven't gotten it working yet.

> We can put the kernel and the environment onto the SD card. I would
> suggest to use SPI only for OpenSBI and U-Boot. Please, use
> CONFIG_DISTRO_BOOT.

Ok.

>>  CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
>>  # CONFIG_NET is not set
>>  # CONFIG_INPUT is not set
>> diff --git a/doc/board/sipeed/maix.rst b/doc/board/sipeed/maix.rst
>> index 1865e2adfb..fa78bcd51c 100644
>> --- a/doc/board/sipeed/maix.rst
>> +++ b/doc/board/sipeed/maix.rst
>> @@ -46,42 +46,14 @@ Boot output should look like the following:
>>      U-Boot 2020.04-rc2-00087-g2221cc09c1-dirty (Feb 28 2020 - 13:53:09 -0500)
>>
>>      DRAM:  8 MiB
>> +    MMC:   spi@53000000:slot@0: 0
> 
> Actual output is
> 
> MMC:   regs=0000000053000000 max-frequency=25000000

Ok, I will update that.

>>      In:    serial@38000000
>>      Out:   serial@38000000
>>      Err:   serial@38000000
> 
> As we do not check if a kernel is available:
> 
> MTD device kernel not found, ret -19
> ## Starting application at 0x80000000 ...
> 
> And then hanging.
> 
> Best regards
> 
> Heinrich
> 
>> -    =>
>> -
>> -Loading Images
>> -^^^^^^^^^^^^^^
>> -
>> -To load a kernel, transfer it over serial.
>> -
>> -.. code-block:: none
>> -
>> -    => loady 80000000 1500000
>> -    ## Switch baudrate to 1500000 bps and press ENTER ...
>> -
>> -    *** baud: 1500000
>> -
>> -    *** baud: 1500000 ***
>> -    ## Ready for binary (ymodem) download to 0x80000000 at 1500000 bps...
>> -    C
>> -    *** file: loader.bin
>> -    $ sz -vv loader.bin
>> -    Sending: loader.bin
>> -    Bytes Sent:2478208   BPS:72937
>> -    Sending:
>> -    Ymodem sectors/kbytes sent:   0/ 0k
>> -    Transfer complete
>> -
>> -    *** exit status: 0 ***
>> -    ## Total Size      = 0x0025d052 = 2478162 Bytes
>> -    ## Switch baudrate to 115200 bps and press ESC ...
>> -
>> -    *** baud: 115200
>> -
>> -    *** baud: 115200 ***
>> -    =>
>> +    Hit any key to stop autoboot:  0
>> +    SF: Detected w25q128fw with page size 256 Bytes, erase size 4 KiB, total 16 MiB
>> +    Reading 5242880 byte(s) at offset 0x00000000
>> +    ## Starting application at 0x80000000 ...
>>
>>  Running Programs
>>  ^^^^^^^^^^^^^^^^
>> @@ -163,6 +135,62 @@ To run legacy images, use the ``bootm`` command:
>>      argv[0] = "<NULL>"
>>      Hit any key to exit ...
>>
>> +Flashing Images
>> +---------------
>> +
>> +To flash a kernel, transfer it over serial, then write it to the kernel
>> +partition.
>> +
>> +.. code-block:: none
>> +
>> +    => loady 80000000 1500000
>> +    ## Switch baudrate to 1500000 bps and press ENTER ...
>> +
>> +    *** baud: 1500000
>> +
>> +    *** baud: 1500000 ***
>> +    ## Ready for binary (ymodem) download to 0x80000000 at 1500000 bps...
>> +    C
>> +    *** file: loader.bin
>> +    $ sz -vv loader.bin
>> +    Sending: loader.bin
>> +    Bytes Sent:2478208   BPS:72937
>> +    Sending:
>> +    Ymodem sectors/kbytes sent:   0/ 0k
>> +    Transfer complete
>> +
>> +    *** exit status: 0 ***
>> +    ## Total Size      = 0x0025d052 = 2478162 Bytes
>> +    ## Switch baudrate to 115200 bps and press ESC ...
>> +
>> +    *** baud: 115200
>> +
>> +    *** baud: 115200 ***
>> +    => sf probe
>> +    SF: Detected w25q128fw with page size 256 Bytes, erase size 4 KiB, total 16 MiB
>> +    => mtd write kernel 80000000 0 25d052
>> +    Writing 2478162 byte(s) at offset 0x00000000
>> +
>> +Partition Scheme
>> +^^^^^^^^^^^^^^^^
>> +
>> +There is no partition scheme specified by the manufacturer. The only requirement
>> +imposed by the firmware is that offset 0 will be loaded and ran. The default
>> +partition scheme is
>> +
>> +========= ======== ======
>> +Partition Offset   Size
>> +========= ======== ======
>> +u-boot    0x000000 496k
>> +env       0x07C000 16k
>> +kernel    0x080000 5M
>> +data      0x580000 10.5M
>> +========= ======== ======
>> +
>> +**NB:** kflash adds a 5-byte header to payloads (and a 32-byte trailer) to all
>> +payloads it flashes. If you use kflash to flash your payload, you will need to
>> +account for this header when specifying what offset in spi flash to load from.
>> +
>>  Pin Assignment
>>  --------------
>>
>>
>
diff mbox series

Patch

diff --git a/board/sipeed/maix/Kconfig b/board/sipeed/maix/Kconfig
index 4c42dd2087..48a4e9dc1a 100644
--- a/board/sipeed/maix/Kconfig
+++ b/board/sipeed/maix/Kconfig
@@ -53,4 +53,15 @@  config BOARD_SPECIFIC_OPTIONS
 	imply CMD_GPIO
 	imply LED
 	imply LED_GPIO
+	imply SPI
+	imply DESIGNWARE_SPI
+	imply SPI_FLASH_GIGADEVICE
+	imply SPI_FLASH_WINBOND
+	imply DM_MTD
+	imply SPI_FLASH_MTD
+	imply CMD_MTD
+	imply ENV_IS_IN_SPI_FLASH
+	imply MMC
+	imply MMC_BROKEN_CD
+	imply MMC_SPI
 endif
diff --git a/configs/sipeed_maix_bitm_defconfig b/configs/sipeed_maix_bitm_defconfig
index f48f7f06e9..7f644e7a37 100644
--- a/configs/sipeed_maix_bitm_defconfig
+++ b/configs/sipeed_maix_bitm_defconfig
@@ -1,6 +1,14 @@ 
 CONFIG_RISCV=y
+CONFIG_ENV_SIZE=0x2000
+CONFIG_ENV_SECT_SIZE=0x1000
+CONFIG_ENV_OFFSET=0x7C000
+CONFIG_ENV_OFFSET_REDUND=0x7E000
 CONFIG_TARGET_SIPEED_MAIX=y
 CONFIG_ARCH_RV64I=y
+CONFIG_USE_BOOTCOMMAND=y
+CONFIG_BOOTCOMMAND="sf probe;mtd read kernel 80000000;go 80000000"
+CONFIG_MTDIDS_DEFAULT="nor0=spi3.0"
+CONFIG_MTDPARTS_DEFAULT="spi3.0:496k(u-boot),16k(env),5632k(kernel),10240k(data)"
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 # CONFIG_NET is not set
 # CONFIG_INPUT is not set
diff --git a/doc/board/sipeed/maix.rst b/doc/board/sipeed/maix.rst
index 1865e2adfb..fa78bcd51c 100644
--- a/doc/board/sipeed/maix.rst
+++ b/doc/board/sipeed/maix.rst
@@ -46,42 +46,14 @@  Boot output should look like the following:
     U-Boot 2020.04-rc2-00087-g2221cc09c1-dirty (Feb 28 2020 - 13:53:09 -0500)
 
     DRAM:  8 MiB
+    MMC:   spi@53000000:slot@0: 0
     In:    serial@38000000
     Out:   serial@38000000
     Err:   serial@38000000
-    =>
-
-Loading Images
-^^^^^^^^^^^^^^
-
-To load a kernel, transfer it over serial.
-
-.. code-block:: none
-
-    => loady 80000000 1500000
-    ## Switch baudrate to 1500000 bps and press ENTER ...
-
-    *** baud: 1500000
-
-    *** baud: 1500000 ***
-    ## Ready for binary (ymodem) download to 0x80000000 at 1500000 bps...
-    C
-    *** file: loader.bin
-    $ sz -vv loader.bin
-    Sending: loader.bin
-    Bytes Sent:2478208   BPS:72937
-    Sending:
-    Ymodem sectors/kbytes sent:   0/ 0k
-    Transfer complete
-
-    *** exit status: 0 ***
-    ## Total Size      = 0x0025d052 = 2478162 Bytes
-    ## Switch baudrate to 115200 bps and press ESC ...
-
-    *** baud: 115200
-
-    *** baud: 115200 ***
-    =>
+    Hit any key to stop autoboot:  0
+    SF: Detected w25q128fw with page size 256 Bytes, erase size 4 KiB, total 16 MiB
+    Reading 5242880 byte(s) at offset 0x00000000
+    ## Starting application at 0x80000000 ...
 
 Running Programs
 ^^^^^^^^^^^^^^^^
@@ -163,6 +135,62 @@  To run legacy images, use the ``bootm`` command:
     argv[0] = "<NULL>"
     Hit any key to exit ...
 
+Flashing Images
+---------------
+
+To flash a kernel, transfer it over serial, then write it to the kernel
+partition.
+
+.. code-block:: none
+
+    => loady 80000000 1500000
+    ## Switch baudrate to 1500000 bps and press ENTER ...
+
+    *** baud: 1500000
+
+    *** baud: 1500000 ***
+    ## Ready for binary (ymodem) download to 0x80000000 at 1500000 bps...
+    C
+    *** file: loader.bin
+    $ sz -vv loader.bin
+    Sending: loader.bin
+    Bytes Sent:2478208   BPS:72937
+    Sending:
+    Ymodem sectors/kbytes sent:   0/ 0k
+    Transfer complete
+
+    *** exit status: 0 ***
+    ## Total Size      = 0x0025d052 = 2478162 Bytes
+    ## Switch baudrate to 115200 bps and press ESC ...
+
+    *** baud: 115200
+
+    *** baud: 115200 ***
+    => sf probe
+    SF: Detected w25q128fw with page size 256 Bytes, erase size 4 KiB, total 16 MiB
+    => mtd write kernel 80000000 0 25d052
+    Writing 2478162 byte(s) at offset 0x00000000
+
+Partition Scheme
+^^^^^^^^^^^^^^^^
+
+There is no partition scheme specified by the manufacturer. The only requirement
+imposed by the firmware is that offset 0 will be loaded and ran. The default
+partition scheme is
+
+========= ======== ======
+Partition Offset   Size
+========= ======== ======
+u-boot    0x000000 496k
+env       0x07C000 16k
+kernel    0x080000 5M
+data      0x580000 10.5M
+========= ======== ======
+
+**NB:** kflash adds a 5-byte header to payloads (and a 32-byte trailer) to all
+payloads it flashes. If you use kflash to flash your payload, you will need to
+account for this header when specifying what offset in spi flash to load from.
+
 Pin Assignment
 --------------