Вопрос или проблема
Недавно я взялся за проект по созданию образа Linux с базовой поддержкой аппаратного обеспечения для NanoPi Neo SOM. Это мой первый опыт работы с встроенным Linux, так как моя предыдущая деятельность в основном была связана с разработкой аппаратного обеспечения для микроконтроллеров.
Для этой задачи я использую Buildroot. Хотя выходной образ работает хорошо, я столкнулся с проблемой: я не могу найти поддержку SPI в /dev/ директории, которая, как я считаю, является ключевой для моего приложения. Тем не менее, я вижу некоторые файлы, связанные с SPI, находящиеся в других частях системы, таких как /sys/bus/, /sys/class/ и /lib/modules/6.10.9/kernel/drivers/.
При вызове команды make linux-menuconfig и поиске конфигурации SPI я нашел следующее:
Symbol: SPI_SPIDEV [=y]
│ Type : tristate
│ Defined at drivers/spi/Kconfig:1222
│ Prompt: Поддержка драйвера SPI устройств в пользовательском режиме
│ Depends on: SPI [=y] && SPI_MASTER [=y]
│ Location:
│ -> Устройства драйверов
│ -> Поддержка SPI (SPI [=y])
│ (1) -> Поддержка драйвера SPI устройств в пользовательском режиме (SPI_SPIDEV [=y])
Вот что я нашел в ./buildroot/output/target/boot/sun8i-h3-nanopi-neo.dtb:
pinctrl@1c20800 {
spi0-pins {
pins = "PC0\0PC1\0PC2\0PC3";
function = "spi0";
phandle = <0x14>;
};
spi1-pins {
pins = "PA15\0PA16\0PA14\0PA13";
function = "spi1";
phandle = <0x15>;
};
};
soc {
spi@1c68000 {
compatible = "allwinner,sun8i-h3-spi";
reg = <0x1c68000 0x1000>;
interrupts = <0x00 0x41 0x04>;
clocks = <0x03 0x1e 0x03 0x52>;
clock-names = "ahb\0mod";
dmas = <0x13 0x17 0x13 0x17>;
dma-names = "rx\0tx";
pinctrl-names = "default";
pinctrl-0 = <0x14>;
resets = <0x03 0x0f>;
status = "disabled";
#address-cells = <0x01>;
#size-cells = <0x00>;
phandle = <0x4e>;
};
spi@1c69000 {
compatible = "allwinner,sun8i-h3-spi";
reg = <0x1c69000 0x1000>;
interrupts = <0x00 0x42 0x04>;
clocks = <0x03 0x1f 0x03 0x53>;
clock-names = "ahb\0mod";
dmas = <0x13 0x18 0x13 0x18>;
dma-names = "rx\0tx";
pinctrl-names = "default";
pinctrl-0 = <0x15>;
resets = <0x03 0x10>;
status = "disabled";
#address-cells = <0x01>;
#size-cells = <0x00>;
phandle = <0x4f>;
};
};
__symbols__ {
spi0_pins = "/soc/pinctrl@1c20800/spi0-pins";
spi1_pins = "/soc/pinctrl@1c20800/spi1-pins";
spi0 = "/soc/spi@1c68000";
spi1 = "/soc/spi@1c69000";
};
Я изменил статус с “disabled” на “okay”, но это не помогло.
У кого-нибудь есть идеи, почему это может происходить, или предложения по решению этой проблемы?
Спасибо!
Ответ или решение
Ваша проблема связана с отсутствием устройства /dev/spidev
в вашей системе на базе NanoPi Neo SOM. Давайте рассмотрим несколько шагов для решения этой проблемы.
1. Проверка конфигурации ядра
Вы уже проверили параметры конфигурации ядра через интерфейс linux-menuconfig
. Убедитесь, что следующие параметры включены:
SPI Support
(SPI [=y]) должен быть активирован.User mode SPI device driver support
(SPI_SPIDEV [=y]) также должен быть активирован.
Проверьте, что все зависимости (например, SPI_MASTER) также активированы.
2. Проверка устройства в Device Tree
Согласно вашему выводу из Device Tree, статус ваших контроллеров SPI установлен на "disabled"
. Вам необходимо изменить его на "okay"
как для spi@1c68000
, так и для spi@1c69000
.
Ваши изменения в Device Tree могут выглядеть так:
spi@1c68000 {
...
status = "okay";
...
};
spi@1c69000 {
...
status = "okay";
...
};
Убедитесь, что вы правильно переписали и применили изменения в Device Tree. Если вы используете Buildroot
, возможно, вам необходимо пересобрать образ и перезаписать его на ваше устройство.
3. Пересборка образа
После внесения изменений в Device Tree и подтверждения конфигурации модуля SPI, вам нужно будет:
- Пересобрать образ с помощью команд
make
в каталогеbuildroot
. - Загрузить обновленный образ на ваше устройство.
4. Проверка наличия устройства
После успешной загрузки проверьте наличие устройства /dev/spidev*
с помощью команды:
ls /dev/spidev*
Если устройство всё ещё отсутствует, выполните следующую команду для проверки загруженных модулей:
lsmod | grep spidev
Если модуль spidev не подключён, попробуйте вручную загрузить модуль:
modprobe spidev
5. Логи ядра
Если после всех вышеописанных шагов проблема не исчезает, полезно проверить логи ядра на наличие ошибок:
dmesg | grep spi
Это может дать информацию о том, что именно произошло с SPI-устройствами при загрузке.
Заключение
Следуя этим шагам, вы должны быть в состоянии активировать поддержку SPI и получить доступ к устройствам /dev/spidev
. Не забывайте учитывать все зависимости и требуемые конфигурации при работе с Buildroot и ядром Linux. Если у вас есть дополнительные вопросы или возникают сложности, не стесняйтесь задавать их. Удачи в вашем проекте!