Руководство по разработке Linux U-Boot
Руководство по разработке Linux U-Boot

Каталог статей

Руководство по разработке Linux U-Boot

1 Предисловие

1.1 Цель написания

В этой статье рассказывается о компиляции и упаковке U-Boot, базовой настройке, использовании общих команд, основных методах отладки и т. д., что обеспечивает основу для трансплантации U-BOOT и разработки приложений.

1.2 Область применения

Этот документ относится к Brandy2.0, платформе U-Boot-2018.

1.3 Соответствующий персонал

Разработчики/сопровождающие U-Boot, разработчики ядра.

2 Объяснение ключевого слова макроса LICHEE

Перейдите в .buildconfig в каталоге longan и проверьте, используются ли в данный момент следующие макросы LICHEE.

Язык кода:javascript
копировать
LICHEE_IC    ——> Имя IC\
LICHEE_CHIP  ——> Название платформы\
LICHEE_BOARD ——> Уровень советаимя\
LICHEE_ARCH  ——> Принадлежащая структура\
LICHEE_BOARD_CONFIG_DIR ——> Уровень совета Оглавление\
LICHEE_BRANDY_OUT_DIR   ——> каталог файлов bin\
LICHEE_PLAT_OUT         ——> Временный каталог bin платформы существует\
LICHEE_CHIP_CONFIG_DIR  ——> Каталог ИС

3 Введение в методы компиляции

3.1 Подготовьте цепочку инструментов компиляции

Шаги по подготовке ссылки на инструмент компиляции следующие:

Язык кода:javascript
копировать
1)cd longan/brandy/brandy-2.0/\
2)./build.sh -t

3.2 Быстрая компиляция boot0 и U-Boot

В каталоге longan/brandy/brandy-2.0/ выполните ./build.sh -p имя платформы, чтобы быстро завершить все действие компиляции загрузки. Название платформы относится к LICHEE_CHIP.

Язык кода:javascript
копировать
./build.sh -p {LICHEE_CHIP}            //Быстрая компиляцияspl/U-Boot
./build.sh -o spl-pub -p {LICHEE_CHIP} //Быстрая компиляцияspl-pub
./build.sh -o uboot -p {LICHEE_CHIP}   //Быстрая компиляцияU-Boot

3.3 Компиляция U-Boot

cd longan/brandy/brandy-2.0/u-boot-2018/, чтобы войти в каталог u-boot-2018. Взяв в качестве примера {LICHEE_CHIP}, просто выполните последовательно следующие операции.

Язык кода:javascript
копировать
1)make {LICHEE_CHIP}_defconfig
2)make -j

3.4 Компилируем boot0/fes/sboot

cd longan/brandy/brandy-2.0/spl-pub для входа в каталог spl-pub. Вам необходимо установить параметры платформы и модуля для компиляции. На примере {LICHEE_CHIP} метод компиляции nand/emmc выглядит следующим образом:

  1. компилироватьboot0
Язык кода:javascript
копировать
make distclean
make p={LICHEE_CHIP} m=nand
make boot0

make distclean
make p={LICHEE_CHIP} m=emmc
make boot0
  1. компилироватьfes
Язык кода:javascript
копировать
make distclean
make p={LICHEE_CHIP} m=fes
make fes
  1. компилироватьsboot
Язык кода:javascript
копировать
make distclean
make p={LICHEE_CHIP} m=sboot
make sboot

4 функции U-Boot и методы настройки/ознакомление с файлами

4.1 Знакомство с функцией U-Boot

Во встроенных операционных системах BootLoader/U-Boot запускается до запуска ядра операционной системы. Он может инициализировать аппаратные устройства и создавать диаграммы отображения пространства памяти, чтобы привести программную и аппаратную среду системы в подходящее состояние и подготовить правильную среду для окончательного вызова ядра операционной системы. На платформе Sunxi, помимо необходимой функции запуска системы загрузки, система BOOT также предоставляет другие функции, такие как программирование и обновление.

Основные функции U-Boot можно разделить на следующие категории:

  1. загрузочное ядро Образ ядра можно загрузить с носителя данных (nand/mmc/spinor) в указанное место в DRAM и запустить.
  2. массовое производство & обновление Включает открытку массово производство,USB массовое производство, запись личных данных, обновление прошивки
  3. Информация о загрузке Отображать запуск при загрузке logo картинакусок(BMP Формат)
  4. Функция быстрой загрузки Реализует стандартные команды fastboot и может использовать fastboot для прошивки устройства.

4.2 Введение в метод настройки функции U-Boot

Различные функции U-Boot можно включать и отключать с помощью defconfig или меню конфигурации. Конкретная конфигурация — это.

Метод заключается в следующем:

4.2.1 Настройка через defconfig
  1. vim /longan/brandy/brandy-2.0/u-boot-2018/configs/{LICHEE_CHIP}_defconfig
  2. После открытия {LICHEE_CHIP}_defconfigili{LICHEE_CHIP}_nor_defconfig удалите соответствующее определение макроса и добавьте "#"Прямо сейчас можно включить или выключить соответствующую функцию. Как показано ниже, просто удалите # перед CONFIG_SUNXI_NAND Прямой сейчас могу поддержать NAND Что касается функции, открытие и закрытие других макроопределений также аналогичны. Вам нужно запустить make после Исправлять xxx_defconfig включает Конфигурацию после Исправлять.

Рисунок 4-1: Схема конфигурации defconfig

4.2.2 Конфигурация через менюconfig

Шаги для настройки через менюconfig следующие:

  1. cd brandy/brandy-2.0/u-boot-2018/
  2. Выполнить make появится команда менюконфигурации menuconfig Окно меню конфигурации, как показано на картинке ниже. В это время Прямо Теперь вы можете запустить функцию каждого модуля. Конфигурация, метод конфигурации. menuconfig Конфигурация Окно менюсерединаиметьиллюстрировать。
  3. Исправлятьназад Конфигурация вступила в силу напрямую make Переписка может быть создана мусорное ведро. Если вы перезапустите make xxx_defconfig,проходитьmenuconfig Способ Исправлятьиз Конфигурациявстречасуществоватьбегатьmake xxx_defconfig был переопределен Конфигурацией xxx_defconfigсередина.

Рисунок 4-2: Схема меню конфигурации меню.

4.3 Знакомство с файлом параметров конфигурации U-Boot

Начиная с Linux-5.4, U-Boot больше не использует sysconfig и dts ядра в качестве файлов конфигурации, а использует собственные dts U-Boot для настройки параметров. kernel-dts и U-Boot-dts полностью независимы.

4.3.1 Путь U-Boot-dts

U-Boot-dts путьдля:vim longan/brandy/brandy-2.0/u-boot-2018/arch/arm/dts

4.3.2 U-Boot-dts, конфигурация defconfig

Элементы конфигурации

Элементы конфигурациизначение

CONFIG_OF_SEPARATE

Создайте дерево устройств U-Boot, чтобы стать частью U-Boot.

CONFIG_OF_BOARD

Отключить использование внешнего dts

CONFIG_DEFAULT_DEVICE_TREE

Выберите имя файла встроенного файла dts.

CONFIG_SUNXI_NECESSARY_REPLACE_FDT

Включите опцию замены внутренних dts на внешние dts.

Элементы конфигурации

Параметры

CONFIG_OF_SEPARATE

y

CONFIG_OF_BOARD

n

CONFIG_DEFAULT_DEVICE_TREE

“{LICHEE_CHIP}-soc-system”

CONFIG_SUNXI_NECESSARY_REPLACE_FDT

y

4.3.3 Примечания к U-Boot-dts
4.3.3.1 Примечания к компиляции

1. DTS делится на DTS уровня платы и системный DTS.

Системные dts определяются CONFIG_DEFAULT_DEVICE_TREE, определение которого можно найти в $(CONFIG_SYS_CONFIG_NAME)_defconfig.

Системные dts в конечном итоге будут включать dts уровня платы, путь к файлу {LICHEE_BOARD_CONFIG_DIR}, имя файла: uboot-board.dts.

  1. О стартовом ДЦ мы сможем судить, когда проводитькомпилировать.
Язык кода:javascript
копировать
OBJCOPY examples/standalone/hello_world.srec
OBJCOPY examples/standalone/hello_world.bin
LD u-boot
OBJCOPY u-boot.srec
OBJCOPY u-boot-nodtb.bin
‘{LICHEE_BOARD_CONFIG_DIR}/uboot-board.dts’ -> ‘~/longan/brandy/brandy-2.0/u-boot-2018/
arch/{LICHEE_ARCH}/dts/.board-uboot.dts’
DTC arch/{LICHEE_ARCH}/dts/{LICHEE_CHIP}-soc-system.dtb
SYM u-boot.sym
SHIPPED dts/dt.dtb
FDTGREP dts/dt-spl.dtb
COPY u-boot.dtb
CAT u-boot-dtb.bin
COPY u-boot.bin
‘u-boot.bin’ -> ‘{LICHEE_CHIP}.bin’ ‘u-boot-g{LICHEE_CHIP}.bin’ -> ‘{LICHEE_BRANDY_OUT_DIR}/bin/u-boot-g{LICHEE_CHIP}.bin’ ‘u-boot-g{LICHEE_CHIP}.bin’ -> ‘{LICHEE_PLAT_OUT}/u-boot-g{LICHEE_CHIP}.bin’
CFGCHK u-boot.cfg
4.3.3.2 Вопросы синтаксиса

Если системные dts и dts уровня платы существуют в узлах с одинаковым именем и по одному и тому же пути, dts уровня платы перезапишет системные dts.

4.3.3.3 Меры предосторожности во время работы
  1. Чтобы обновить параметры ядра перед запуском ядра dts и Можетсуществовать U-Boot консоль Проверять Исправлять дц. Разделенный по этапам, его можно разделить на использование внутреннего dts Этап и использование ядра dts этап, как показано ниже.

Рисунок 4-3: Диаграмма изменения dts

  1. Вы можете использовать команду set_working_fdt для переключения текущего действующего fdt.
Язык кода:javascript
копировать
[04.562]update bootcmd
[04.576]change working_fdt 0x7bebee58 to 0x7be8ee58
[04.587]update dts
Hit any key to stop autoboot: 0
=> set
	set_working_fdt setenv setexpr
=> set_working_fdt 0x7bebee58
change working_fdt 0x7be8ee58 to 0x7bebee58
=>

5 Введение в общие команды U-Boot

5.1 описание команды окружения

Вы можете просмотреть и изменить переменные среды в {LICHEE_CHIP_CONFIG_DIR}/configs/default/env.cfg с помощью команды env. Во время запуска миникомпьютера нажмите любую клавишу, чтобы войти в состояние команды оболочки U-Boot, и введите команду «env», чтобы просмотреть справочную информацию по команде.

Конкретные примеры заключаются в следующем:

  1. Введите команду «env print",Можно ли проверить все текущие переменные среды?,следующее:
Язык кода:javascript
копировать
=> pri
ab_partition_list=bootloader,env,boot,vendor_boot,dtbo,vbmeta,vbmeta_system,vbmeta_vendor
android_trust_chain=true
boot_fastboot=fastboot
boot_normal=sunxi_flash read 45000000 boot;bootm 45000000
boot_recovery=sunxi_flash read 45000000 recovery;bootm 45000000
bootcmd=run setargs_mmc boot_normal
bootdelay=0
bootreason=charger
bt_mac=20:A1:11:12:13:44
cma=8M
console=ttyAS0,115200
earlyprintk=sunxi-uart,0x05000000
fdtcontroladdr=7bed0e60
fileaddr=40000000
filesize=15cf6
force_normal_boot=1
init=/init
initcall_debug=0
keybox_list=widevine,ec_key,ec_cert1,ec_cert2,ec_cert3,rsa_key,rsa_cert1,rsa_cert2,rsa_cert3
loglevel=8
mac=10:14:15:15:9A:CA
mmc_root=/dev/mmcblk0p4
nand_root=/dev/nand0p4
partitions=bootloader_a@mmcblk0p1:bootloader_b@mmcblk0p2:env_a@mmcblk0p3:env_b@mmcblk0p4:
boot_a@mmcblk0p5:boot_b@mmcblk0p6:vendor_boot_a@mmcblk0p7:vendor_boot_b@mmcblk0p8:
super@mmcblk0p9:misc@mmcblk0p10:vbmeta_a@mmcblk0p11:vbmeta_b@mmcblk0p12:
vbmeta_system_a@mmcblk0p13:vbmeta_system_b@mmcblk0p14:vbmeta_vendor_a@mmcblk0p15:
vbmeta_vendor_b@mmcblk0p16:frp@mmcblk0p17:empty@mmcblk0p18:metadata@mmcblk0p19:
private@mmcblk0p20:dtbo_a@mmcblk0p21:dtbo_b@mmcblk0p22:media_data@mmcblk0p23:
UDISK@mmcblk0p24
rotpk_status=0
setargs_mmc=setenv bootargs earlyprintk=${earlyprintk} clk_ignore_unused initcall_debug=${
initcall_debug} console=${console} loglevel=${loglevel} root=${mmc_root} init=${init}
cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac}
specialstr=${specialstr} gpt=1 androidboot.force_normal_boot=${force_normal_boot}
androidboot.slot_suffix=${slot_suffix}
setargs_nand=setenv bootargs earlyprintk=${earlyprintk} clk_ignore_unused initcall_debug=${
initcall_debug} console=${console} loglevel=${loglevel} root=${nand_root} init=${init}
cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac}
specialstr=${specialstr} gpt=1 androidboot.force_normal_boot=${force_normal_boot}
androidboot.slot_suffix=${slot_suffix}
slot_suffix=_a
snum=A100B3N041
wifi_mac=10:A1:11:12:13:44
Environment size: 2078/131068 bytes
=>
  1. Введите команду «env set bootdelay 3", вы можете изменить переменную среды bootdelay (т.е. boot При запуске log время задержки обратного отсчета середина) размер значения.
  2. Введите команду «env save",Прямо Сейчас вы можете сохранить вышеуказанные изменения, снова включить питание после сохранения и ввести команду «сброс», Прямо Сейчас вы можете видеть, что вышеупомянутое изменение времени задержки загрузки было изменено и вступило в силу.
  3. Для других команд env пожалуйста Проверятьenv helpинформация.

5.2 Описание команды чтения sunxi_flash

5.2.1 Как использовать

Используйте следующую команду для чтения данных по указанному адресу флэш-памяти по указанному адресу DRAM:

Язык кода:javascript
копировать
sunxi_flash read dram_addr flash_addr
5.2.2 Примеры использования
Язык кода:javascript
копировать
sunxi_flash read 0x45000000 env — чтение данных раздела env по адресу 0x45000000 DRAM.
sunxi_flash read 45000000 boot;bootm 45000000 — чтение данных загрузочного раздела flashсередина в расположение DRAM 0x45000000.		адрес и Началось с 0x45000000.

5.3 описание команды fastboot

Fastboot — это универсальный инструмент для прошивки на платформе Android, а также хороший инструмент для разработки и отладки. Ниже описаны основные принципы использования fastboot.

5.3.1 Предварительные условия для использования

Инструмент fastboot для ПК можно получить из Google Android SDK (Android-sdk-windows/tools) или сгенерированного файла после компиляции исходного кода Android (out/host/linux-x86/bin).

В системах Linux использование fastboot не требует установки драйвера. Однако в системах Windows перед использованием fastboot необходимо установить драйверы, связанные с fastboot. Драйвер adb также можно успешно установить в режиме быстрой загрузки, но его нельзя использовать. Используйте предоставленный нами драйвер и установите его вручную.

5.3.2 Этапы использования
  1. Включите мини-компьютер и нажмите любую клавишу, чтобы войти в состояние команды U-Boot;
  2. Введите команду «fastboot» на последовательном порту;
  3. Откройте инструмент быстрой загрузки на ПК и введите команду «Устройства быстрой загрузки», чтобы увидеть, отображается ли устройство быстрой загрузки;
  4. Делаем это правильно fastboot Под помещением устройства введите команду «fastboot flash env /path/to/env.fex", запишите env.fex в раздел env (значение env.fexсерединаbootdelay в каталоге /path/to/ должно быть и flash середина Исходное значение env серединаbootdelay отличается, поэтому его можно определить в соответствии с другим значением bootdelay. fastboot Вспышкаданетуспех), То же, что и загрузка раздела env.fex. Введите команду «fastboot flash boot /path/to/boot.img» загружает ядро ​​в память середина;
  5. Введите «быстрая загрузка команда «перезагрузка» для перезапуска, Проверять запускает обратный отсчет Прямо Изменяется ли значение сейчасbootdelay;
5.3.3 Примеры использования базовой команды Fastboot
  1. Ниже приведены примеры нескольких основных команд быстрой загрузки: Устройства быстрой загрузки: отображение устройств быстрой загрузки. fastboot стирание: стереть раздел, например, fastboot стереть загрузку, стереть загрузочный раздел. fastboot flash: старый раздел (раздел, который необходимо записать), например fastboot flash boot/path/to/boot.img, записать boot.img в загрузочный раздел.
  2. На что следует обратить внимание: fastboot середина использует тот же раздел, что иsys_partition.fexсередина, конкретная Информация о разделможет включить питание маленькой машины, чтобы начать вход. U-Boot shell Статус команды, введите команду «часть list sunxi_flash 0"серединаполучать,Информация о раздел следующий:
Язык кода:javascript
копировать
=> part list sunxi_flash 0

Partition Map for UNKNOWN device 0 -- Partition Type: EFI

Part         Start LBA          End LBA          Name
		     Attributes
	         Type GUID
		Partition GUID
1 		0x00008000 		0x00017fff 		"bootloader"
		attrs: 0x8000000000000000
		type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
		guid: a0085546-4166-744a-a353-fca9272b8e45
2 		0x00018000		0x0001ffff 		"env"
        attrs: 0x8000000000000000
        type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid: a0085546-4166-744a-a353-fca9272b8e46
3 		0x00020000 		0x0002ffff 		"boot"
        attrs: 0x8000000000000000
        type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid: a0085546-4166-744a-a353-fca9272b8e47
4 		0x00030000 		0x0032ffff 		"super"
		attrs: 0x8000000000000000
        type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid: a0085546-4166-744a-a353-fca9272b8e48
5 		0x00330000 		0x00337fff 		"misc"
        attrs: 0x8000000000000000
        type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid: a0085546-4166-744a-a353-fca9272b8e49
6 		0x00338000 		0x00347fff 		"recovery"
        attrs: 0x8000000000000000
        type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid: a0085546-4166-744a-a353-fca9272b8e4a

5.4 полное описание команды

Команда fat может запрашивать, читать и записывать файлы на устройствах хранения данных, относящихся к файловой системе FAT. При упаковке прошивки мы создадим образ раздела загрузочных ресурсов и упорядочим файлы в указанном каталоге в соответствии с форматом файловой системы. . Все файлы в исходном каталоге включены и полностью упорядочены в соответствии со структурой каталогов. Когда этот файл образа будет записан в раздел на устройстве хранения, вы увидите, что содержимое этого раздела такое же, как и в исходном каталоге. Используя FAT, вы можете легко получить доступ к данным с флэш-памяти миникомпьютера в виде файлов и каталогов, например, для отображения логотипов. Эти команды в основном используются вместе с U-диском или SD-картой и в основном используются для чтения раздела FAT на этих съемных носителях. Соответствующие рабочие команды следующие:

  1. fatls: выведите список всех файлов в соответствующем каталоге устройства, пример следующий:

Рисунок 5-1: Пример диаграммы выполнения команды Fatls

иллюстрировать

Пополнитьиллюстрировать,fatls mmc 2:2 первый из 2 означает emmc оборудование, 2 означает его номер раздела,Чтоиллюстрироватьследующеекартина:

​ картина 5-2: fatls Параметры командыиллюстрироватькартина

  1. fatinfo: Распечатайте файл системыинформации соответствующего каталога устройства. Пример изображения следующий:

изображение 5-3: пример выполнения команды fatinfo

  1. fatload: от FAT Файловая системасередина читает двоичный файл в RAM хранилищесередина,Примерследующее:
Язык кода:javascript
копировать
sunxi#usb start
(Re)start USB...
USB0: start sunxi ehci1...
config usb pin success
config usb clk ok
sunxi ehci1 init ok...
USB EHCI 1.00
scanning bus 0 for devices... 3 USB Device(s) found
scanning usb for storage devices... 1 Storage Device(s) found
sunxi#fatls usb 0:1 /
16024600 sandisksecureaccessv3_win.exe
sandisk secureaccess/
lost.dir/
Android/
test/
video test/
amapauto/
0 vid_20161017_160818.ts
phoenixsuit/
system volume information/
0 vid_20161017_160919.ts
video/
156672 wifi pro_com su.exe
495 sys.ini
1035 pr_80211g_all.ini
config/
158208 wifi pro_new.exe
158208 wifi pro.exe
0 vid_20161017_164822.ts
0 vid_20161017_164906.ts
sunxi-tvd/
71149 sys_config.fex
vga/
397836884 system.img
14180352 boot.img
13 file(s), 13 dir(s)
sunxi#fatload usb 0:1 0x42000000 boot.img
reading boot.img
14180352 bytes read in 1149 ms (11.8 MiB/s)
sunxi#mmc dev 2
mmc2(part 0) is current device
sunxi#mmc write 0x42000000 0x15000 5000
MMC write: dev # 2, block # 86016, count 20480 ... 20480 blocks written: OK

иллюстрировать:Вот и вседействовать Вскоре U Запишите boot.img диска в соответствующий mmc Адрес раздела.

  1. fatwrite: из памяти середина записывает соответствующий файл в файл системысередина устройства.

5.5 мд описание команды

Команда md может просмотреть данные указанной памяти, что удобно для понимания состояния данных памяти и отладки работы. Как его использовать:

Язык кода:javascript
копировать
md 0xF0000000: Прямо сейчас используйте команду md Проверять память DRAM Содержимое по адресу 0xF0000000

5.6 Описание команды FDT

FDT: сокращение для плоского дерева устройств. После остановки консоли U-Boot введите fdt, чтобы просмотреть справку по команде fdt.

Язык кода:javascript
копировать
sunxi#fdt
fdt - flattened device tree utility commands
Usage:
fdt addr [-c] <addr> [<length>] - Set the [control] fdt location to <addr>
fdt move <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active
fdt resize - Resize fdt to size + padding to 4k addr
fdt print <path> [<prop>] - Recursive print starting at <path>
fdt list <path> [<prop>] - Print one level starting at <path>
fdt get value <var> <path> <prop> - Get <property> and store in <var>
fdt get name <var> <path> <index> - Get name of node <index> and store in <var>
fdt get addr <var> <path> <prop> - Get start address of <property> and store in <var>
fdt get size <var> <path> [<prop>] - Get size of [<property>] or num nodes and store in <var>
fdt set <path> <prop> [<val>] - Set <property> [to <val>]
fdt mknode <path> <node> - Create a new node after <path>
fdt rm <path> [<prop>] - Delete the node or <property>
fdt header
fdt bootcpu <id> - Set boot cpuid
fdt memory <addr> <size> - Add/Update memory node
fdt rsvmem print - Show current mem reserves
fdt rsvmem add <addr> <size> - Add a mem reserve
fdt rsvmem delete <index> - Delete a mem reserves
fdt chosen [<start> <end>] - Add/update the /chosen branch in the tree
<start>/<end> - initrd start/end addr
NOTE: Dereference aliases by omiting the leading '/', e.g. fdt print ethernet0。
sunxi#

иллюстрировать

Обычно используемые команды: fdt list и fdt set. fdt list используется для запроса конфигурации узла, а fdt set используется для изменения конфигурации узла.

5.6.1 Конфигурация запроса

Сначала определите путь к запрашиваемому полю в дереве устройств. Если вы не знаете путь, вам нужно использовать команду fdt и выполнить следующие действия.

запрос строки. 1. Найдите корневой каталог.

Язык кода:javascript
копировать
sunxi#fdt list /
/ {
    model = "{LICHEE_CHIP}";
    compatible = "arm,{LICHEE_CHIP}", "arm,{LICHEE_CHIP}";
    interrupt-parent = <0x00000001>;
    #address-cells = <0x00000002>;
    #size-cells = <0x00000002>;
    ......................
    cpuscfg {
    };
    ion {
    };
    dram {
    };
    memory@40000000 {
    };
    interrupt-controller@1c81000 {
    };
    sunxi-chipid@1c14200 {
    };
    timer {
    };
    pmu {
    };
    dvfs_table {
    };
    dramfreq {
    };
    gpu@0x01c40000 {
    };
    wlan {
    };
    bt {
    };
    btlpm {
    };
};

Если вы найдете необходимую конфигурацию, например конфигурацию WLAN, просто выполните следующую команду.

Язык кода:javascript
копировать
sunxi#fdt list /wlan //Внимание путьсередина /
wlan {
    compatible = "allwinner,sunxi-wlan";
    clocks = <0x00000096>;
    wlan_power = "vcc-wifi";
    wlan_io_regulator = "vcc-wifi-io";
    wlan_busnum = <0x00000001>;
    status = "okay";
    device_type = "wlan";
    wlan_regon = <0x00000077 0x0000000b 0x00000002 0x00000001 0xffffffff 0xffffffff 0
    x00000000>;
    wlan_hostwake = <0x00000077 0x0000000b 0x00000003 0x00000006 0xffffffff 0xffffffff
    0x00000000>;
};
  1. Найдите его в каталоге существующих соц. Если существует Шаг 1 середина не нашел Конфигурацию, которую вы ищете,Например, Конфигурация nand0.,Тогда Конфигурация может находиться в каталоге существованияsoc.
Язык кода:javascript
копировать
sunxi#fdt list /soc
soc@01c00000 {
    compatible = "simple-bus";
    #address-cells = <0x00000002>;
    #size-cells = <0x00000002>;
    ranges;
    device_type = "soc";
    ......................
    hdmi@01ee0000 {
    };
    tr@01000000 {
    };
    pwm@01c21400 {
    };
    nand0@01c03000 {
    };
    thermal_sensor {
    };
    cpu_budget_cool {
    };
    .......................
};

Затем используйте следующую команду, чтобы отобразить его:

Язык кода:javascript
копировать
sunxi#fdt list /soc/nand0
nand0@01c03000 {
    compatible = "allwinner,sun50i-nand";
    device_type = "nand0";
    reg = <0x00000000 0x01c03000 0x00000000 0x00001000>;
    interrupts = <0x00000000 0x00000046 0x00000004>;
    clocks = <0x00000004 0x0000007e>;
    pinctrl-names = "default", "sleep";
    pinctrl-1 = <0x00000081>;
    nand0_regulator1 = "vcc-nand";
    nand0_regulator2 = "none";
    nand0_cache_level = <0x55aaaa55>;
    nand0_flush_cache_num = <0x55aaaa55>;
    nand0_capacity_level = <0x55aaaa55>;
    nand0_id_number_ctl = <0x55aaaa55>;
    nand0_print_level = <0x55aaaa55>;
    nand0_p0 = <0x55aaaa55>;
    nand0_p1 = <0x55aaaa55>;
    nand0_p2 = <0x55aaaa55>;
    nand0_p3 = <0x55aaaa55>;
    status = "disabled";
    nand0_support_2ch = <0x00000000>;
    pinctrl-0 = <0x000000a9 0x000000aa>;
};
  1. Используйте поиск псевдонима пути. Псевдоним да device tree середина — это сокращение полного пути с выделенным узлом. ( /aliases) Чтобы представить информацию, связанную с псевдонимом, используйте следующую команду для проверки конфигурации псевдонима системысередина:
Язык кода:javascript
копировать
sunxi#fdt list /aliases
aliases {
    serial0 = "/soc@01c00000/uart@01c28000";
    ..............
    mmc0 = "/soc@01c00000/sdmmc@01c0f000";
    mmc2 = "/soc@01c00000/sdmmc@01C11000";
    nand0 = "/soc@01c00000/nand0@01c03000";
    disp = "/soc@01c00000/disp@01000000";
    lcd0 = "/soc@01c00000/lcd0@01c0c000";
    hdmi = "/soc@01c00000/hdmi@01ee0000";
    pwm = "/soc@01c00000/pwm@01c21400";
    boot_disp = "/soc@01c00000/boot_disp";
};
sunxi#

Поскольку псевдоним пути узла nand0 настроен, вы можете использовать следующую команду для отображения информации о конфигурации узла nand0.

Язык кода:javascript
копировать
sunxi#fdt list nand0
nand0@01c03000 {
    compatible = "allwinner,sun50i-nand";
    device_type = "nand0";
    reg = <0x00000000 0x01c03000 0x00000000 0x00001000>;
    ..................
    pinctrl-names = "default", "sleep";
    pinctrl-1 = <0x00000081>;
};

Примечание. Во всех командах fdt в качестве параметра пути можно использовать псевдоним.

Язык кода:javascript
копировать
fdt list <path> [<prop>] - Print one level starting at <path>
fdt set <path> <prop> [<val>] - Set <property> [to <val>]
5.6.2 Изменение конфигурации
5.6.2.1 Изменение целочисленной конфигурации

Формат команды: fdt set path prop Пример: фдт set /wlan wlan_busnum <0x2>

Язык кода:javascript
копировать
sunxi#fdt list /wlan
wlan {
    compatible = "allwinner,sunxi-wlan";
    clocks = <0x00000096>;
    wlan_power = "vcc-wifi";
    wlan_io_regulator = "vcc-wifi-io";
    wlan_busnum = <0x00000001>;
    status = "disable";
    device_type = "wlan";
};
sunxi#fdt set /wlan wlan_busnum <0x2>
sunxi#fdt list /wlan
wlan {
    compatible = "allwinner,sunxi-wlan";
    clocks = <0x00000096>;
    wlan_power = "vcc-wifi";
    wlan_io_regulator = "vcc-wifi-io";
    wlan_busnum = <0x00000002>; //Исправлятьназад    status = "disable";
    device_type = "wlan";
};

Примечание: Исправлять — целое число.,Форма конфигурации для массива также может быть использована по мере необходимости.,Нужно разделять пробелами。Формат команды: fdt set path prop <0x1 0x2 0x3>

5.6.2.2 Изменение конфигурации строки

Формат команды: fdt set path prop “xxxxx” Пример: фдт set /wlan status “disable”

Язык кода:javascript
копировать
sunxi#fdt list /wlan
wlan {
    compatible = "allwinner,sunxi-wlan";
    clocks = <0x00000096>;
    wlan_power = "vcc-wifi";
    wlan_io_regulator = "vcc-wifi-io";
    wlan_busnum = <0x00000001>;
    status = "okay";
    device_type = "wlan";
};
sunxi#fdt set /wlan status "disable"
sunxi#fdt list /wlan
wlan {
    compatible = "allwinner,sunxi-wlan";
    clocks = <0x00000096>;
    wlan_power = "vcc-wifi";
    wlan_io_regulator = "vcc-wifi-io";
    wlan_busnum = <0x00000001>;
    status = "disable"; //Исправлятьназад    device_type = "wlan";
};
sunxi#

Примечание: Исправлять, когда строка,Форма конфигурации для массива также может быть использована по мере необходимости.,Необходимо разделить пробелами. Формат команды: fdt set path prop «string1» «string2»

5.6.3 Специальные инструкции по настройке GPIO или PIN-кода

Соответствие интерфейсаизчисловой номериллюстрироватьследующее:

Язык кода:javascript
копировать
#define PA 0
#define PB 1
#define PC 2
#define PD 3
#define PE 4
#define PF 5
#define PG 6
#define PH 7
#define PI 8
#define PJ 9
#define PK 10
#define PL 11
#define PM 12
#define PN 13
#define PO 14
#define PP 15
#define default 0xffffffff

Sysconfig описано в gpio изформаследующее:Port:порт+Серийный номер внутри группы<Функциональное распределение><Статус внутреннего сопротивления><способность вождения><Статус выходного уровня>

5.6.3.1 Инструкции по настройке контактов

Узлы Pinctrl делятся на cpux и cpus. Соответствующие пути к узлам следующие: Cpux: /soc/pinctrl@01c20800 Cpus:/soc/pinctrl@01f02c00.

5.6.3.2 Просмотр конфигурации PIN-кода

PIN Конфигурацияполе атрибутаиллюстрировать:

поле атрибута

значение

allwinner,function

Соответствует имени первичного ключа в sysconfig.

allwinner,pins

Соответствует имени порта в каждой конфигурации gpio в sysconfig.

allwinner,pname

Соответствует имени подраздела первичного ключа в sysconfig.

allwinner,muxsel

Функциональное распределение

allwinner,pull

Статус внутреннего сопротивления

allwinner,drive

способность вождения

allwinner,data

Статус выходного уровня

иллюстрировать

Среди них 0xffffffff означает использование значения по умолчанию.

Проверьте конфигурацию PIN-кода cpux следующим образом.

Язык кода:javascript
копировать
sunxi#fdt list /soc/pinctrl@01c20800/lcd0
lcd0@0 {
    linux,phandle = <0x000000ab>;
    phandle = <0x000000ab>;
    allwinner,pins = "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", "PD20", "PD21";
    allwinner,function = "lcd0";
    allwinner,pname = "lcdd0", "lcdd1", "lcdd2", "lcdd3", "lcdd4", "lcdd5", "lcdd6", "lcdd7", "lcdd8", "lcdd9";
    allwinner,muxsel = <0x00000003>;
    allwinner,pull = <0x00000000>;
    allwinner,drive = <0xffffffff>;
    allwinner,data = <0xffffffff>;
};
sunxi#

Проверьте конфигурацию PIN-кода процессора следующим образом.

Язык кода:javascript
копировать
sunxi# fdt list /soc/pinctrl@01f02c00/s_uart0
s_uart0@0 {
    linux,phandle = <0x000000b4>;
    phandle = <0x000000b4>;
    allwinner,pins = "PL2", "PL3";
    allwinner,function = "s_uart0";
    allwinner,pname = "s_uart0_tx", "s_uart0_rx";
    allwinner,muxsel = <0x00000002>;
    allwinner,pull = <0xffffffff>;
    allwinner,drive = <0xffffffff>;
    allwinner,data = <0xffffffff>;
};
sunxi#
5.6.3.3 Изменение конфигурации PIN-кода

использовать fdt Команда set может изменить PIN середина Связанныйполе атрибута

Язык кода:javascript
копировать
sunxi#fdt set /soc/pinctrl@01c20800/lcd0 allwinner,drive <0x1>
sunxi#fdt list /soc/pinctrl@01c20800/lcd0
lcd0@0 {
    linux,phandle = <0x000000ab>;
    phandle = <0x000000ab>;
    allwinner,pins = "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", "PD20", "PD21";
    allwinner,function = "lcd0";
    allwinner,pname = "lcdd0", "lcdd1", "lcdd2", "lcdd3", "lcdd4", "lcdd5", "lcdd6", "lcdd7", "lcdd8", "lcdd9";
    allwinner,muxsel = <0x00000003>;
    allwinner,pull = <0x00000000>;
    allwinner,drive = <0x00000001>;
    allwinner,data = <0xffffffff>;
};

иллюстрировать

Пример середина, где Исправлять повлияет на все порты, представленные allwinner,pins вождения Конфигурация,Исправлятьallwinner,muxsel, Значения allwinner, pull, allwinner и data также будут иметь аналогичный эффект.

5.6.3.4 Инструкции по настройке GPIO

Соответствие GPIO в дереве устройств, на примере usb_id_gpio в usb

Язык кода:javascript
копировать
sunxi#fdt list /soc/usbc0
usbc0@0 {
    test = <0x00000002 0x00000003 0x12345678>;
    device_type = "usbc0";
    compatible = "allwinner,sun50i-otg-manager";
    ........
    usb_serial_unique = <0x00000000>;
    usb_serial_number = "20080411";
    rndis_wceis = <0x00000001>;
    status = "okay";
    usb_id_gpio = <0x00000030 0x00000007 0x00000009 0x00000000 0x00000001 0xffffffff 0xffffffff>;
};

соответствует device tree середина usb_id_gpio = <0x00000030 0x00000007 0x00000009 0x00000000 0x00000001 0xffffffff 0xffffffff>,объяснятьследующее:

Значение атрибута

значение

0x00000030

Информация, относящаяся к узлу в дереве устройств, которую здесь можно пропустить.

0x00000007

Порт PH, т.е. #define PH 7

0x00000009

Серийный номер внутри группы, т.е. PH09.

0x00000000

Функциональное распределение, Вскоре PH09 настроен как вход

0x00000001

Статус внутреннего сопротивления, Оснащен системой подтягивания.

0xffffffff

способность вождения, значение по умолчанию

0xffffffff

выходной уровень, значение по умолчанию

Если вам нужно изменить usb_id_gpio Конфигурация может быть следующей (пример Исправить способность вождения, пункты второго уровня вывода):

Язык кода:javascript
копировать
sunxi#fdt set /soc/usbc0 usb_id_gpio <0x00000030 0x00000007 0x00000009 0x00000000 0x00000001 0x2 0x1>
sunxi#fdt list
usbc0@0 {
    test = <0x00000002 0x00000003 0x12345678>;
    device_type = "usbc0";
    compatible = "allwinner,sun50i-otg-manager";
    ........
    usb_serial_unique = <0x00000000>;
    usb_serial_number = "20080411";
    rndis_wceis = <0x00000001>;
    status = "okay";
    usb_id_gpio = <0x00000030 0x00000007 0x00000009 0x00000000 0x00000001 0x00000002 0x00000001>; //Исправлятьok
};
sunxi#

5.7 Другие команды иллюстрировать (загрузка, reset, efex)

  1. загрузка: запустить ядро
  2. сброс: сброс и перезагрузка системы.
  3. efex: войти в состояние записи

иллюстрировать

Примечание. Для получения дополнительной информации о других командах U-Boot введите состояние команды оболочки U-Boot и введите «help», чтобы узнать больше.

6 Введение в основные методы отладки

отладочная информация вводится следующим образом:

  1. debug_mode debug_mode Может контролировать Boot0 печатиоценка,Открытьдокумент{LICHEE_BOARD_CONFIG_DIR}/sys_config.fex,существоватьхозяинключ [platform] Добавьте подраздел «debug_mode» в раздел = 8" означает включение всей печати, debug_mode=0 значит закрыть При запуске Boot0 печати log,Не явно Конфигурация debug_mode, нажимать debug_mode=8 иметь дело с. В настоящее время обычно используются следующие степени печати: 0 (выключить всю печать), 1 (печатать только узел отображения), 4 (печатать информацию об ошибке), 8 (печатать все log информация)。 debug_mode Может контролировать U-Boot печатиоценка,Открыть файл {LICHEE_BOARD_CONFIG_DIR}/b3/uboot-board.dts,существовать platform узел Добавьте подраздел «debug_mode» в раздел = 8" означает включение всей печати, debug_mode=0 значит закрыть При запуске U-Boot печатиlog, Не явно Конфигурация debug_mode, нажимать debug_mode=8 иметь дело с. В настоящее время обычно используются следующие степени печати: 0 (выключить всю печать), 1 (печатать только узел отображения), 4 (печатать информацию об ошибке), 8 (печатать все log информация)。
  2. usb_debug существует процесс горения или запуска середина, если вы столкнулись с горением неудач или неудачным запуском, вероятно, зависнет существование usb Связанные модули, но вы не уверены в конкретном местоположении. В настоящее время вы можете включить usb_debug для отладки. После включения usb_debug он будет связан. usb Соответствующие операции будут распечатаны более подробно. Путь Открытьusb_debug: файл Открытьusb_base.h, его макрос #defineSUNXI_USB_DEBUG, определение середина Открыть, Открыть, а затем перекомпилировать U-Boot И пакетburn прямо сейчас Может。

7. Введите метод программирования.

  1. Нажмите и удерживайте клавишу Fel во время загрузки.
  2. При загрузке откройте последовательный порт и нажмите цифру «2» на клавиатуре.
  3. Войдите в консоль U-Boot и введите efex.
  4. Войдите в консоль Android и введите «reboot efex».

8 часто используемых функций интерфейса

8.1 Интерфейсы, связанные с FDT

  1. const void *fdt_getprop(const void *fdt, int nodeoffset, const char *name, int *lenp)

Функция: получить значение указанного атрибута.

параметр:

fdt: Работа flattened device tree

nodeoffset: Смещение узла, который нужно изменить

name: Имя атрибута, который нужно получить

lenp: Получить длину значения атрибута (будет перезаписано) или NULL

возвращаться:

ненулевое значение (указатель на значение свойства): успех

NULL(lenp пусто): не удалось

Код неисправности (lenp не пусто): не удалось

  1. int fdt_set_node_status(void *fdt, int nodeoffset, enum fdt_status status, unsigned int error_code)

Функция: Установить статус узла

параметр:

fdt: Работа flattened device tree

nodeoffset: Смещение узла, который нужно изменить

status:FDT_STATUS_OKAY, FDT_STATUS_DISABLED, FDT_STATUS_FAIL, FDT_STATUS_FAIL_ERROR_CODE

error_code:optional, only used if status is FDT_STATUS_FAIL_ERROR_CODE

возвращаться:

0: успех

Нет 0: неудача

  1. int fdt_path_offset(const void *fdt, const char *path)

Функция: найти смещение узла по полному пути.

параметр:

fdt: Работа fdt

path: полное имя пути

возвращаться:

>=0(узелизкомпенсировать): успех

<0: неудачный код

  1. static inline int fdt_setprop_u32(void *fdt, int nodeoffset, const char *name, uint32_t val)

Функция: Установите значение атрибута на единицу. 32 Целочисленное значение бита. Если значение атрибута не существует, создайте новый атрибут.

параметр:

fdt: Работа flattened device tree

nodeoffset: Смещение узла, который нужно изменить

name: Имя атрибута, который нужно изменить

val:32 целевое значение бита

возвращаться:

0: успех

<0: неудачный код

  1. static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *name, uint64_t val)

Функция: аналогично fdt_setprop_u32, устанавливает значение атрибута равным единице. 64 Целочисленное значение бита. Если значение атрибута не существует, создайте новый атрибут.

параметр:

fdt: Работа flattened device tree

nodeoffset: Смещение узла, который нужно изменить

name: Имя атрибута, который нужно изменить

val:64 целевое значение бита

возвращаться:

0: успех

<0: неудачный код

  1. #define fdt_setprop_string(fdt, nodeoffset, name, str) fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)

Функция: Установите значение атрибута на единицу.String,Если значение атрибута не существует, существует,Затем создайте новый атрибут

параметр:

fdt: Работа flattened device tree

nodeoffset: Смещение узла, который нужно изменить

name: Имя атрибута, который нужно изменить

str: целевое значение

возвращаться:

0: успех

<0: неудачный код

Примечание: существует sys_config.fex Конфигурациясередина, статус включения узла для 0 или 1. конвертировать в fdt соответствующий середине status Свойство отключено или все в порядке.

  1. int save_fdt_to_flash(void *fdt_buf, size_t fdt_size)

Функция: сохранить изменения в flash

параметр:

fdt_buf: текущий Работа flattened device tree

fdt_size: текущий Работа flattened device tree Размер можно передать через fdt_totalsize(fdt_buf )Получать

возвращаться:

0: успех

<0: неудача

  1. Ссылка на приложение

U-Boot середина fdt Реализация командной строки: cmd/fdt.c

8.2 функции интерфейса, связанные с env

  1. int env_set(const char *varname, const char *varvalue)

Функция: установка переменных среды varname Значение установлено на varvalue, недействительно после перезапуска

параметр:

varname: Имя переменной среды, которую необходимо установить.

varvalue: Измените указанную переменную среды на это значение.

возвращаться:

0: успех

Нет 0: неудача

  1. char *env_get(const char *name)

Функция: получить значение указанной переменной среды.

параметр:

name: имя переменной

возвращаться:

NULL: неудача

Нет пусто (значение переменной окружения): успех:

  1. int env_save(void)

Функция: сохранить переменные среды, и они все равно будут сохранены после перезапуска.

параметр: никто

возвращаться:

0: успех

Нет 0: неудача

  1. Ссылка на приложение

board/sunxi/sunxi_bootargs.c update_bootargs предоставляет информацию ядру через cmdline, в основном путем обновления переменной bootargs для реализации env_set("bootargs", cmdline).

8.3 Вызов командной строки U-Boot

  1. int run_command_list(const char *cmd, int len, int flag)

Функция: исполнение U-Boot командная строка

параметр:

cmd: указатель командного символа

len: командная длина строки, заданная для-1 затем автоматически получите

flag: произвольно, потому что sunxi середина не используется

возвращаться:

0: успех

Нет 0: неудача

  1. Ссылка на приложение:

common/autoboot.c autoboot_command реализует команду автоматического запуска U-Boot.

s = env_get(“bootcmd”);

run_command_list(s, -1, 0)。

8.4 Чтение и запись флэш-памяти

  1. int sunxi_flash_read(uint start_block, uint nblock, void *buffer)

Функция: Считайте nблок указанной начальной позиции start_block в буфер.

параметр:

start_block: начальный адрес

nblock:block число

buffer: адрес памяти

возвращаться:

0: успех

Нет 0: неудача

  1. int sunxi_flash_write(uint start_block, uint nblock, void *buffer)

Функция: Записать буфер в nblockсередина в указанной начальной позиции start_block.

параметр:

start_block: начальный адрес

nblock:block число

buffer: адрес памяти

возвращаться:

0: успех

Нет 0: неудача

  1. int sunxi_sprite_read(uint start_block, uint nblock, void *buffer)

Функция аналогична sunxi_flash_read.

  1. int sunxi_sprite_write(uint start_block, uint nblock, void *buffer)

Функция аналогична sunxi_flash_write.

  1. Ссылка на приложение

common/sunxi/board_helper.c sunxi_set_bootcmd_from_mis реализует операции чтения и записи в разделе misc

8.5 Получение информации о разделах

  1. int sunxi_partition_get_partno_byname(const char *part_name)

Функция: получить номер раздела на основе имени раздела.

параметр:

part_name: Имя раздела

возвращаться:

<0: неудача

>0(Номер раздела):успех

  1. int sunxi_partition_get_info_byname(const char *part_name, uint *part_offset, uint *part_size)

Функция: Согласно Имя разделаполучатьсмещение разделаиразмер

параметр:

part_name: Имя раздела

part_offset: смещение раздела

part_size: размер раздела

возвращаться:

0: успех

-1: неудача

  1. uint sunxi_partition_get_offset_byname(const char *part_name)

Функция: Согласно Имя разделполучить смещение

параметр:

part_name: Имя раздела

возвращаться:

<=0 : неудача

>0 : успех

  1. int sunxi_partition_get_info(const char *part_name, disk_partition_t *info)

Функция: Получить информацию о разделе на основе part_name.

параметр:

part_name: Имя раздела

info: Информация о разделе

возвращаться:

Нет 0: неудача

0: успех

  1. lbaint_t sunxi_partition_get_offset(int part_index)

Функция: карта sprite Получить смещение в режиме раздела

параметр:

part_index: Номер раздела

возвращаться:

>=0(компенсировать):успех

-1: неудача

  1. Ссылка на приложение

При запускенагрузкакартинакусок:drivers/video/sunxi/logo_display/sunxi_load_bmp.c

8.6 Операции, связанные с GPIO

  1. int fdt_get_one_gpio(const char* node_path, const char* prop_name,user_gpio_set_t* gpio_list)

Функция: В соответствии с путем node_path и gpio Имя prop_name получает gpio Конфигурация

параметр:

node_path:fdt путь

prop_name:gpio имя

gpio_list: необходимо получить gpio информация

возвращаться:

0:успех

-1:неудача

  1. ulong sunxi_gpio_request(user_gpio_set_t *gpio_list, __u32 group_count_max)

Функция: Согласно gpio Конфигурацияполучать gpio ручка управления

параметр:

gpio_list:gpio Конфигурациясписок,Может Зависит отfdt_get_one_gpio получить

group_count_max: gpio_listсередина самый крупный gpio Конфигурациячисло

возвращаться:

0:неудача

>0(gpio ручка управления):успех

  1. __s32 gpio_write_one_pin_value(ulong p_handler, __u32 value_to_gpio, const char *gpio_name)

Функция: Согласно gpio ручка управлениязаписать данные

параметр:

p_handler:gpio ручка управления,Может Зависит отsunxi_gpio_requestПолучить

value_to_gpio: данные для записи, 0 или 1

gpio_name:gpio имя

возвращаться:

EGPIO_SUCCESS:успех

EGPIO_FAIL:неудача

  1. Ссылка на приложение

Состояние индикатора работы:

Язык кода:javascript
копировать
ssprite/sprite_led.c

user_gpio_set_t gpio_init;

fdt_get_one_gpio("/soc/card_boot", "sprite_gpio0", &gpio_init); //Получаем gpio Конфигурация /soc/card_bootсерединаспрайт_gpio0

sprite_led_hd = sunxi_gpio_request(&gpio_init, 1); //Получаем gpioручку управления

gpio_write_one_pin_value(sprite_led_hd, sprite_led_status,"sprite_gpio0"); //действоватьledсостояние

9 Фаза инициализации часто используемых ресурсов

env :Переменные среды доступны после инициализации.

fdt :существовать U-Boot Доступен сразу после начала операции

malloc :существоватьдоступен только после переезда

boy illustration
[Спецификация] Результаты и исключения возврата интерфейса SpringBoot обрабатываются единообразно, поэтому инкапсуляция является элегантной.
boy illustration
Интерпретация каталога веб-проекта Flask
boy illustration
Что такое подробное объяснение файла WSDL_wsdl
boy illustration
Как запустить большую модель ИИ локально
boy illustration
Подведение итогов десяти самых популярных веб-фреймворков для Go
boy illustration
5 рекомендуемых проектов CMS с открытым исходным кодом на базе .Net Core
boy illustration
Java использует httpclient для отправки запросов HttpPost (отправка формы, загрузка файлов и передача данных Json)
boy illustration
Руководство по развертыванию Nginx в Linux (Centos)
boy illustration
Интервью с Alibaba по Java: можно ли использовать @Transactional и @Async вместе?
boy illustration
Облачный шлюз Spring реализует примеры балансировки нагрузки и проверки входа в систему.
boy illustration
Используйте Nginx для решения междоменных проблем
boy illustration
Произошла ошибка, когда сервер веб-сайта установил соединение с базой данных. WordPress предложил решение проблемы с установкой соединения с базой данных... [Легко понять]
boy illustration
Новый адрес java-библиотеки_16 топовых Java-проектов с открытым исходным кодом, достойных вашего внимания! Обязательно к просмотру новичкам
boy illustration
Лучшие практики Kubernetes для устранения несоответствий часовых поясов внутри контейнеров
boy illustration
Введение в проект удаления водяных знаков из коротких видео на GitHub Douyin_TikTok_Download_API
boy illustration
Весенние аннотации: подробное объяснение @Service!
boy illustration
Пожалуйста, не используйте foreach для пакетной вставки в MyBatis. Для 5000 фрагментов данных потребовалось 14 минут. .
boy illustration
Как создать проект Node.js с помощью npm?
boy illustration
Mybatis-plus использует typeHandler для преобразования объединенных строк String в списки списков.
boy illustration
Не удалось установить программное обеспечение Mitsubishi. Возможно, возникла проблема с реестром.
boy illustration
Разрешение ошибок проекта SpringBoot 3 mybatis-plus: org.apache.ibatis.binding.BindingException: неверный оператор привязки
boy illustration
Более краткая проверка параметров. Для проверки параметров используйте SpringBoot Validation.
boy illustration
Поиграйтесь с интеграцией Spring Boot (платформа запланированных задач Quartz)
boy illustration
Несколько популярных режимов интерфейса API: RESTful, GraphQL, gRPC, WebSocket, Webhook.
boy illustration
Redis: практика публикации (pub) и подписки (sub)
boy illustration
Подробное объяснение пакета Golang Context
boy illustration
Краткое руководство: создайте свое первое приложение .NET Aspire
boy illustration
Краткое обсуждение метода пакетной вставки MyBatis: обработка 100 000 фрагментов данных занимает всего 2 секунды.
boy illustration
[Инструмент] Используйте nvm для управления переключением версий nodejs, это так здорово!
boy illustration
HTML можно преобразовать в word_html для отображения текстовых документов.