Линукс для pic32
2019-11-02 16:36Я уже писал, как за два простых шага установить и запустить Debian на плате pic32mz-da. Компиляцию U-Boot для микроконтроллера pic32 я тоже описывал. Здесь я покажу, как собрать из исходников ядро Linux, и как с нуля построить образ файловой системы Debian на карточке micro-SD.
1. Строим ядро Linux для pic32
Исходные тексты ядра Linux для микроконтроллеров семейства pic32mz-da были опубликованы фирмой Microchip а 2015 году. Я внес два небольших исправления: доработал драйвер SDHC, чтобы обойти багу с короткими обменами (описанную в Errata sheet), и добавил флаги в ядре, нужные для корректного функционирования systemd.
Вот как выглядит компиляция под Ubuntu версии 18.04. Огромное спасибо Мите Коротину, который первым прошёл этот трудный путь и показал мне все хитрости. Устанавливаем кросс-компилятор:
Собираем загружаемые модули:
2. Собираем файловую систему Debian для mips32
1. Строим ядро Linux для pic32
Исходные тексты ядра Linux для микроконтроллеров семейства pic32mz-da были опубликованы фирмой Microchip а 2015 году. Я внес два небольших исправления: доработал драйвер SDHC, чтобы обойти багу с короткими обменами (описанную в Errata sheet), и добавил флаги в ядре, нужные для корректного функционирования systemd.
Вот как выглядит компиляция под Ubuntu версии 18.04. Огромное спасибо Мите Коротину, который первым прошёл этот трудный путь и показал мне все хитрости. Устанавливаем кросс-компилятор:
Скачиваем тексты ядра Linux, с правками для PIC32:sudo apt-get install gcc-mips-linux-gnu
Конфигурируем и собираем. Здесь я предполагаю, что в каталоге u-boot-pic32 находится U-Boot, готовый и собранный для pic32. Нам от него понадобится утилита mkimage:git clone https://github.com/sergev/linux-pic32.git
В результате мы имеем в папке boot бинарное ядро и дерево устройств, которое надо будет поместить в папку /boot файловой системы на SD-карточке.cd linux-pic32
make ARCH=mips CROSS_COMPILE=mips-linux-gnu- pic32mzda_defconfig
make ARCH=mips CROSS_COMPILE=mips-linux-gnu-
gzip -9 < arch/mips/boot/vmlinux.bin > arch/mips/boot/vmlinux.bin.gz
../u-boot-pic32/tools/mkimage -A MIPS -a 0x88000000 -e 0x88000400 -d arch/mips/boot/vmlinux.bin.gz arch/mips/boot/vmlinux-pic32
mkdir -p ../boot
cp -a arch/mips/boot/uImage ../boot/vmlinux-pic32
cp -a arch/mips/boot/dts/pic32/pic32mzda_sk.dtb ../boot/pic32mzda.dtb
Собираем загружаемые модули:
Содержимое папки lib/modules/ надо будет скопировать в /lib/modules на SD-карточке.make ARCH=mips CROSS_COMPILE=mips-linux-gnu- INSTALL_MOD_PATH=$PWD/.. modules_install
2. Собираем файловую систему Debian для mips32
Файловую систему нетрудно получить, воспользовавшись симулятором QEMU и установив свежий Debian 9.0 "Stretch" на виртуальную платформу MIPS32 Malta.
Устанавливаем симулятор QEMU:
Продолжаем установку до самого конца, в соответствии с запросами на экране. Процесс занимает несколько часов. Подробности смотрите в инструкции по установке Debian.
По ходу установки создаётся образ initrd.img, который содержит компоненты, необходимые для старта системы. Нужно извлечь этот файл с виртуального диска. Утилита qemu-nbd даёт возможность смонтировать образ диска QEMU.
3. Формируем карточку micro-SD
Создаём пустой файл размером 7 Гбайт - будущий образ карточки micro-SD.
Устанавливаем симулятор QEMU:
Скачиваем ядро Линукса и установочный образ для платформы Malta:sudo apt install qemu-system-mips
Создаём образ жёсткого диска:wget http://ftp.debian.org/debian/dists/stretch/main/installer-mipsel/current/images/malta/netboot/vmlinux-4.9.0-11-4kc-malta
wget http://ftp.debian.org/debian/dists/stretch/main/installer-mipsel/current/images/malta/netboot/initrd.gz
Устанавливаем Debian:qemu-img create -f qcow2 hda.qcow 8G
qemu-system-mipsel \
-cpu 4KEc \
-M malta \
-m 512 \
-hda hda.qcow \
-kernel vmlinux-4.9.0-11-4kc-malta \
-initrd initrd.gz \
-append "root=/dev/sda1 nokaslr" \
-nographic

Продолжаем установку до самого конца, в соответствии с запросами на экране. Процесс занимает несколько часов. Подробности смотрите в инструкции по установке Debian.
По ходу установки создаётся образ initrd.img, который содержит компоненты, необходимые для старта системы. Нужно извлечь этот файл с виртуального диска. Утилита qemu-nbd даёт возможность смонтировать образ диска QEMU.
Загружаем систему с получившегося диска:sudo apt-get install qemu-utils
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 hda.qcow
sudo mount /dev/nbd0p1 /mnt
cp /mnt/boot/initrd.img-4.9.0-1-4kc-malta .
sudo umount /mnt
Входим как root, архивируем всё в один файл и пересылаем на основной компьютер. Здесь username - ваше имя на основном компьютере:qemu-system-mipsel \
-cpu 4KEc \
-M malta \
-m 512 \
-hda hda.qcow \
-kernel vmlinux-4.9.0-11-4kc-malta \
-initrd initrd.img-4.9.0-11-4kc-malta \
-append root=/dev/sda1 \
-nographic
Все упомянутые файлы можно скачать в готовом виде здесь: http://vak.ru/pub/unix/debian-on-mips32/cd /
tar cf rootfs-4.9.0-11-4kc-malta.tar bin boot etc home lib media mnt opt root sbin srv usr var
scp rootfs-4.9.0-11-4kc-malta.tar username@10.0.2.2:
3. Формируем карточку micro-SD
Создаём пустой файл размером 7 Гбайт - будущий образ карточки micro-SD.
Чтобы смонтировать файл как диск, воспользуемся драйвером /dev/loop. Сначала выясним, какое из устройств /dev/loop# свободно на вашем компьютере:dd if=/dev/zero of=pic32fs.img seek=7516192767 bs=1 count=1
В моём случае это /dev/loop31, у вас может быть что-то другое. В последующих командах будем использовать это значение. Подключим наш файл как диск /dev/loop31:losetup -f
Вызовем редактор разделов:losetup /dev/loop31 pic32fs.img
Создайте таблицу разделов в формате msdos. Создайте два раздела:gparted /dev/loop31
- Раздел №1 - формат ext4, с 256 Мбайт свободного пространства после него;
- Раздел №2 - формат linux-swap, размером 256 Мбайт.
Распакуйте файловую систему Debian из предыдущего пункта:sudo mount /dev/loop31p1 /mnt
Скопируйте ядро, дерево устройств и загружаемые модули из первого пункта:sudo tar xf rootfs-4.9.0-11-4kc-malta.tar.gz -C /mnt
Создайте недостающие папки:cd /mnt
rm -rf boot/* lib/modules/*
cp -a ~/boot .
cp -a ~/lib/modules/* lib/modules/
Вызовите текстовый редактор и замените содержимое файла /mnt/etc/fstab следующим:cd /mnt
sudo mkdir dev proc sys tmp run
sudo chmod 777 tmp
sudo chmod +t tmp
В текстовом редакторе замените последние две строки файла /mnt/etc/network/interfaces на следующие:/dev/mmcblk0p1 / ext4 errors=remount-ro 0 1
/dev/mmcblk0p2 none swap sw 0 0
Запретите автоматическое обновление пакетов, иначе оно будет тормозить систему в самый неподходящий момент:allow-hotplug eth0
iface eth0 inet dhcp
Размонтируйте файловую систему и отключите /dev/loop:sudo echo "APT::Periodic::Enable "0";" > /mnt/etc/apt/apt.conf.d/20auto-upgrades
Файловая система Debian для pic32 готова. Запишите её на карточку micro-SD и можете грузить систему. Как это сделать - читайте здесь. Готовый файл можно скачать по ссылке: pic32fs-minimal.zipsudo umount /mnt
losetup -d /dev/loop31
