Я работаю со встроенным чипом Stamp9g20 . Он основан на платформе Atmel at91sam9g20. Для клиента мне нужно обновить ядро до более новой версии. После небольшого исследования я попал на страницы Linux4SAM и их дополнительный слой yocto с ядром 4.14!
Однако, когда я компилирую это ядро, я не вижу все свои устройства, например, я могу записать в память NAND и смонтировать устройство USB, но я не вижу и не монтирую никакие устройства mmc / mci. Я попытался проверить, насколько Stamp9g20 действительно отличается от AT91SAM9G20EK, но я не смог найти однозначного ответа на этот вопрос.
Репозиторий Linux4SAM поддерживает слегка отличающиеся версии семейства AT91SAM9, но он работает на ядре 4.14, используя at91sam9g20ek.dts в качестве входных данных для платы. Пришлось добавить мою машину в список совместимых машин, поэтому она будет компилироваться и для версий 9g20.
COMPATIBLE_MACHINE += 'at91sam9g20ek'
и мой machine.conf выглядит так:
#@Name: ATMEL AT91SAM9G20EK
#@DESCRIPTION: Machine configuration for Atmel's evaluation board
#
# define SOC_FAMILY (we are the family of ...)
SOC_FAMILY = "atsam9"
# Add arm926ejs to the DEFAULTTUNE, so it will be selected in our environment
DEFAULTTUNE = "arm926ejs"
# http://lists.openembedded.org/pipermail/openembedded-core/2019-January/277527.html
#TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'armv5', ' -march=armv5t${ARMPKGSFX_DSP}', '', d)}"
TUNE_CCARGS = "${@bb.utils.contains('TUNE_FEATURES', 'armv5', ' -march=armv5t${ARMPKGSFX_DSP}', '', d)}"
# We rely on the generic meta-atmel layer
require conf/machine/include/at91sam9.inc
MACHINE_FEATURES = "apm ext2 ext3 ext4 usbhost usbgadget vfat jffs2"
# This device tree is available in the kernel
KERNEL_DEVICETREE = " \
at91sam9g20ek.dtb \
"
# Create filesystems tar.gz and jffs2
IMAGE_FSTYPES += " tar.gz jffs2 tar"
# UNTESTED IMAGES (both bootstrap and uboot)
UBOOT_MACHINE ?= "at91sam9g20ek_nandflash_defconfig"
UBOOT_ENTRYPOINT = "0x20008000"
UBOOT_LOADADDRESS = "0x20008000"
AT91BOOTSTRAP_MACHINE ?= "at91sam9g20ek"
Когда ядро запускается, оно показывает, что оно регистрирует драйвер устройства по адресу 0xffff8000, но не видит блочное устройство.
bus: 'mmc': add driver mmcblk
bus: 'sdio': add driver sdio_uart
bus: 'platform': add driver atmel_mci
bus: 'platform': driver_probe_device: matched device fffa8000.mmc with driver atmel_mci
bus: 'platform': really_probe: probing driver atmel_mci with device fffa8000.mmc
atmel_mci fffa8000.mmc: no init pinctrl state
atmel_mci fffa8000.mmc: version: 0x210
atmel_mci fffa8000.mmc: using PDC
device: 'mmc0': device_add
atmel_mci fffa8000.mmc: Atmel MCI controller at 0xfffa8000 irq 30, 1 slots
driver: 'atmel_mci': driver_bound: bound to device 'fffa8000.mmc'
bus: 'platform': really_probe: bound device fffa8000.mmc to driver atmel_mci
Я пробовал эту плату с версией 2.6.x, где она работает как положено.
Как сделать доступным в системе блочное устройство mmcblk? Нужно ли мне менять .dts (в настоящее время я использую at91sam9g20ek.dts в качестве шаблона с небольшим изменением памяти NAND). Или что я могу сделать, чтобы получить больше информации о том, почему ядро не взаимодействует с устройством mmc?
Кроме того, если я сравниваю исходный код до структуры dts, я не вижу существенных различий в части кода mcc:
https://elixir.bootlin.com/linux/v3.6.9/source/arch/arm/mach-at91/board-sam9g20ek.c
https://elixir.bootlin.com/linux/v3.6.9/source/arch/arm/mach-at91/board-stamp9g20.c
Единственное отличие, которое я нашел,
доска at91sam9g20ek:
.slot_b = 1, /* Only one slot so use slot B */
stamp9g20 доска:
.slot_b = 0,
поэтому я попытался изменить свойство reg <> в dts на 1, но безрезультатно ...