×

Внимание

Форум находится в режиме только для чтения.

NUC98R. SPI. Компиляция U-boot, Ядра и Файловой системы JFFS2. Загрузка образов.

3 года 11 мес. назад - 3 года 11 мес. назад #6369 от AEfimov
Представленная конфигурация отладки (NK-NUC98R) помимо NAND-flash укомплектован QSPI и SPI0 модулями, 16 и 1 мб соответственно, которые могут также могут использоваться для установки Linux, независимо от содержимого NAND-памяти. Таким образом возможна установка сразу двух независимых операционных систем на данную плату.
Процедура компиляции загрузчика, ядра, а также способ компиляции и тип используемой файловой системы отличны от описанных нами для NAND -flash памяти.
В этой публикации мы коснемся всех отличии в процессе установки Linux на SPI-flash. Те же операции, что были упомянуты в NAND-алгоритме, и не были затронуты здесь, выполняются в соответствии с руководством по NAND-flash, поэтому перед установкой Linux в SPI необходимо ознакомиться со всеми нашими предыдущими материалами по работе с этой отладкой.

Компиляция U-boot:

Для работы с SPI-flash требуется провести следующие настройки U-boot

В файле include/configs/nuc980_evb.h:

#define CONFIG_SYS_USE_SPIFLASH 
/#define CONFIG_SYS_USE_NANDFLASH*/
/#define CONFIG_ENV_IS_IN_NAND*/ 
#define CONFIG_ENV_IS_IN_SPI_FLASH

В интерфейсе menuconfig:

-> SPL / TPL --->
         [ ] enable SPL 

-> Device Drivers -> 
         SPI Support [*] 
               NUC980 SPI driver Select NUC980 SPI in Quad mode or Normal mode (Quad mode) --->
 	
-> Device Drivers
     -> SPI Flash Support [*] 
          Legacy SPI Flash Interface support [*] 
          SPI flash Bank/Extended address register support [*] 
          Winbond SPI flash support [*]

-> Command line interface 
     -> Device access commands
         [  ] nand
         [*] sf 
         [*] sspi

Файл u-boot.bin запишется в корневую директорию.

Компиляция ядра:

Для работы с SPI-flash необходимо провести следующие настройки в menuconfig:

General setup --->
   [ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support 
Boot options ---> 
(root=/dev/mtdblock1 rw rootfstype=jffs2 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M) Default kernel command string Kernel command line type

Device Drivers --->
   [*] SPI support --->
     <*> Nuvoton NUC980 Series QSPI Port 0
            QSPI0 pin selection (Normal mode) --->
           <*> QSPI0 enable pin for the second chip select
           <*> QSPI0 TX/RX by PDMA or not (No PDMA) 

Pin selection (Use SS1 (PD0)) --->
      <*> Nuvoton NUC980 Series SPI Port 0
             SPI0 transfer mode selection (Normal mode) --->
             <*> SPI0 TX/RX by PDMA or not (No PDMA)
             SPI0 IO port selection (Port D) --->
             < > SPI0 enable pin for the second chip select

Device Drivers --->
      <*> Memory Technology Device (MTD) support --->
             <*> Caching block device access to MTD devices
             <*> SPI-NOR device support
             Self-contained MTD device drivers --->
                   <*> Support most SPI Flash chips (AT26DF, M25P, W25X, ...)

File systems --->
       [*] Miscellaneous filesystems ---> 
              <*> Journalling Flash File System v2 (JFFS2) support 
                       [*] JFFS2 write-buffering support

Если инженерное решение по применению отладки требует поддержки PDMA, необходимо в первую очередь включить его UART драйвер, соответствующий задействованному UART-порту и выставить поддержку PDMA в настройках SPI-шины.

-> Device Drivers                                                   
        -> Character devices                                              
             -> Serial drivers                                               
                  -> NUC980 UART (1-9) support (NUC980_UART(1-9) [=y])

Device Drivers --->
   [*] SPI support --->
        <*> Nuvoton NUC980 Series QSPI Port 0
               <*> QSPI0 TX/RX by PDMA or not (USE PDMA) 
         <*> Nuvoton NUC980 Series SPI Port 1
               <*> SPI0 TX/RX by PDMA or not (USE PDMA)

Далее необходимо задать параметры форматирования QSPI - flash, для этого внесем в файл arch/arm/mach-nuc970/dev.c

Важно: Параметры форматирования должны совпадать с атрибутами загрузки образов в SPI через Nu-Writer, то есть image_offset_size не должен быть меньше реального размера образа.

static struct mtd_partition nuc970_spi0_flash_partitions[] = {

   {
                .name = "u-boot",
                .size = 512 * 1024,
                .offset = 0,
        },
                                {
                .name = "u-boot env",
                .size = 512 * 1024,
                .offset = MTDPART_OFS_APPEND,
        },
                                {
                .name = "kernel",
                .size = 4 * 1024 * 1024,
                .offset = MTDPART_OFS_APPEND,
        },     
                                {
                .name = "rootfs",
                .offset = MTDPART_OFS_APPEND,
                .size = MTDPART_SIZ_FULL,
        },            
};

Данная отладка укомплектована QSPI-модулем W25Q128FV имеющей размер сектора в 4K, в то время как файловая система использует минимальный размер сектора 8K. Для корректной работы файловой системы необходимо внести следующие изменения в файл drivers/mtd/spi-nor/spi-nor.c. (SECT_4K меняем на 0)

{ "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, SECT_4K) },
=>
   { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) },

Теперь можно скомпилировать образ ядра с поддержкой SPI командой “make uimage
Файл образа 980uImage появится в папке Image в директории, содержащей папку с дистрибутивом ядра.

Файловая система:

Для работы с SPI используем утилиту mkjffs2 из в пакета MTD-Utils.

Скачаем дистрибутив (в нашем случае для Fedora32, если вы используете другую сборку Linux, необходимо найти в сети соответствующую версию пакета):

https://fedora.pkgs.org/32/fedora-aarch64/mtd-utils-2.1.1-2.fc32.aarch64.rpm.html

Устанавливаем пакет:

# dnf install mtd-utils

Выполняем:

$ mkfs.jffs2 -s 0x1000 -e 0x10000 -p 0x800000 -d rootfs_jffs2/ - o rootfs.img

Полученный образ копируется в директорию из который выполнена утилита.

Теперь, собственно, приступим к загрузке подготовленных производителем образов Linux, U-Boot и файловой системы.

Порядок загрузки образов в SPI-Flash:

1) Выбираем loader в поле Image Type, в поле Image execute address вписываем 0xe00000. Нажимаем на иконку справа от поля Image Name, находим файл u-boot.bin. Нажимаем Burn.

Далее загружаем непосредственно образ LINUX:

Выбираем файл 980uimage (выбираем All files (*.*), чтобы образ отобразился в окне). В поле Image start offset вписываем 0х200000 и нажимаем Burn (Image type - Data).

Теперь нужно загрузить в память файловую систему:

Выбираем файл rootfs.img (выбираем All files (*.*), чтобы образ отобразился в окне). В поле Image start offset (Image type - Data) указываем 500000 и нажимаем Burn.

Перезагружаем плату и в командной строке U-boot вводим следующие команды:

set bootcmd sf probe 0 18000000\;sf read 0x7fc0 0x100000 0x400000\;bootm 0x7fc0
sa

ОС Linux запущен и можно начинать работу.
Время создания страницы: 0.070 секунд
Работает на Kunena форум