Аудио выход разведен не той стороной. Не баг, а фича.
Аудио выход разведен не той стороной. Не баг, а фича.

Некоторое время назад Arduino казалось какой-то непонятной магией когда только узнал про нее. Потом быстро перешел к самим микроконтроллерам. Позже, работая программистом микроконтроллеров, захотелось чего-то большего и я уже смотрел в сторону линукса и одноплатных компьютеров. В руки попал Raspberry Pi, но это готовый продукт с определенной периферией (не хочу HDMI, хочу RGB LCD) и некоторое время спустя я уже думал как сделать что-то подобное самому.

Вдохновился статьей SO YOU WANT TO BUILD AN EMBEDDED LINUX SYSTEM, где автор собирает десяток отладочных плат с разными SOC и минимальной периферией. Объясняет, что это не так страшно и сложно как это кажется на первый взгляд.

Цель

Как минимум получить консоль с командной строкой, максимум - запуск Doom. Коммерческой основы нет, скорее proof of concept и опыт. В этой статье кратко опишу этапы разработки, а в конце помигаем светодиодом.

Плата

Вообще первая ревизия платы была сделана полтора года назад на STM32MP157DB1, без WIFI и USB. Этот процессор можно разместить на 4х слоях. Но в связи с последними событиями, дефицитом полупроводников, данный чип было сложно найти и свободно купить за вменяемую стоимость.

За референс следующей платы была взята Orange Pi 3 LTS (или One Plus), Pine H64 Model B. Схемотехника основных компонентов у них идентичная и в свободном доступе. Процессор Allwinner H6. Что было важно для меня, имеет параллельный интерфейс для подключения дисплея. Схема питания RGB LCD (AVDD, VGH, VGL, Backlight) была сделана на основе схемы RGB LCD HAT для Raspberry Pi, только с другими компонентами и адаптирована под необходимые напряжения. В этом помог Power Designer от Texas Instruments. Touchscreen - STMPE811, WIFI -AP6212.

Трассировка.
Footprint's и 3d модели основных компонентов брал готовые из онлайн библиотек. Хотелось собрать быстро и чтобы работало. В свободное от работы время. Вопрос об ЭМС, просчет импеданса, выравнивание длин проводников на линиях DDR не стоял на первом месте. К этому подстегивал автор статьи выше, акцентируя что это не самое важное. Для проверки концепта. На реальном проекте так делать конечно не надо.

Интересно было узнать, что шину данных от процессора к DDR можно подключать как удобно, внутри одного байта. Единственное, надо соответственно подключить сигналы маски DQMx и стробов DQSx. Порядок хранения битов для памяти не важен. Это подтверждает и схемотехника референсных плат.

Итак, заказываем платы из китая. Цена примерно 140$, со всеми комиссиями и доставкой. Дорого, сравнивая с ценой 10-15$ за предыдущие 4х слойные платы. В этот раз оплата заказа из РФ только через алиэкспресс. 5 штук, 6 слоев, без трафарета, а хотелось. В данный момент, как сообщили менеджеры на алиэкспресс трафарет сделать не могут.

Пайка.
Задача запаять и проверить базовые компоненты без правильной работы которых дальнейшая сборка не имеет смысл. Это - питание, процессор, sd-карта, память. Заливаем прошивку и смотрим в консоль (об этом позже). С первого раза запустить не получилось. Выпаивал процессор, память и запаивал обратно. Новые компоненты ждать из китая долго не хотелось, лучше брать с запасом. Реболил вручную, ввиду отсутствия трафаретов. Сложно, но можно. Брал шары 0.3, раскладывал на контакты поверх флюса и грел феном. Способов много. Смотрим ролики на ютубе - "How to reball ic without a stencil". Процессор после ручного реболлинга работал. Проблема была в другом. Не запаял одну из перемычек на питание процессора. Выяснилось это после чтения даташита о порядке инициализации питания. Также не определялась оперативная память. Вероятно была перегрета после нескольких раз ее пайки. Новая заработала. В остальном обошлось поверхностными доработками которые можно заметить на фото.

Прошивка

Система сборки - buildroot, defconfig от платы Orange Pi One Plus. Для запуска и получения приглашения командной строки править ничего не пришлось. Собираем бинарь и заливаем sdcard.img с balenaEtcher на sd-карту. Сборка и путь прошивки:

host@host:~/my_dev/buildroot/buildroot-2022.05$ make orangepi_one_plus_defconfig
host@host:~/my_dev/buildroot/buildroot-2022.05$ make
host@host:~/my_dev/buildroot/buildroot-2022.05/output/images$ ls -l | grep sdcard.img
-rw-r--r-- 1 host host 382730240 сен 19 11:46 sdcard.img
Вывод консоли
U-Boot SPL 2018.09 (Aug 31 2022 - 23:38:08 +0300)
DRAM: 1024 MiB
Trying to boot from MMC1
NOTICE:  BL31: v2.0(release):
NOTICE:  BL31: Built : 05:52:03, Aug 29 2022
NOTICE:  BL31: Detected Allwinner H6 SoC (1728)
NOTICE:  PMIC: Probing AXP805
NOTICE:  PMIC: AXP805 detected


U-Boot 2018.09 (Aug 31 2022 - 23:38:08 +0300) Allwinner Technology

CPU:   Allwinner H6 (SUN50I)
Model: OrangePi One Plus
DRAM:  1 GiB
MMC:   SUNXI SD/MMC: 0
Loading Environment from FAT... *** Warning - bad CRC, using default environment

In:    serial@5000000
Out:   serial@5000000
Err:   serial@5000000
Net:   No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found /extlinux/extlinux.conf
Retrieving file: /extlinux/extlinux.conf
145 bytes read in 3 ms (46.9 KiB/s)
1:      linux
Retrieving file: /Image
34877952 bytes read in 3499 ms (9.5 MiB/s)
append: console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait
Retrieving file: /sun50i-h6-orangepi-one-plus.dtb
22256 bytes read in 5 ms (4.2 MiB/s)
## Flattened Device Tree blob at 4fa00000
   Booting using the fdt blob at 0x4fa00000
   Loading Device Tree to 0000000049ff7000, end 0000000049fff6ef ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.17.13-g9a13308e835f-dirty (host@host-U31SG) (aarch64-buildroot-linux-uclibc-gcc.br_real (Buildroot 2022.05) 10.3.0, GNU ld (GNU Binutils) 2.37) #9 SMP PREEMPT Mon Sep 19 112
[    0.000000] Machine model: OrangePi One Plus
[    0.000000] efi: UEFI not found.
[    0.000000] NUMA: No NUMA configuration found
[    0.000000] NUMA: Faking a node at [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000] NUMA: NODE_DATA [mem 0x7fddcb40-0x7fddefff]
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000]   DMA32    empty
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000] cma: Reserved 32 MiB at 0x000000007cc00000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.1
[    0.000000] percpu: Embedded 20 pages/cpu s41944 r8192 d31784 u81920
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: ARM erratum 845719
[    0.000000] Fallback order for Node 0: 0 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 258048
[    0.000000] Policy zone: DMA
[    0.000000] Kernel command line: console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait
[    0.000000] Unknown kernel command line parameters "earlyprintk", will be passed to user space.
[    0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.000000] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 960732K/1048576K available (15616K kernel code, 3212K rwdata, 8560K rodata, 6528K init, 512K bss, 55076K reserved, 32768K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=4.
[    0.000000]  Trampoline variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[    0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[    0.000229] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.001122] Console: colour dummy device 80x25
[    0.001211] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
[    0.001228] pid_max: default: 32768 minimum: 301
[    0.001298] LSM: Security Framework initializing
[    0.001416] Mount-cache hash table entries: 2048 (order: 2, 16384 bytes, linear)
[    0.001433] Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes, linear)
[    0.002930] cblist_init_generic: Setting adjustable number of callback queues.
[    0.002949] cblist_init_generic: Setting shift to 2 and lim to 1.
[    0.003128] rcu: Hierarchical SRCU implementation.
[    0.004995] EFI services will not be available.
[    0.005255] smp: Bringing up secondary CPUs ...
[    0.006029] Detected VIPT I-cache on CPU1
[    0.006105] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[    0.006844] Detected VIPT I-cache on CPU2
[    0.006887] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[    0.007541] Detected VIPT I-cache on CPU3
[    0.007577] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[    0.007643] smp: Brought up 1 node, 4 CPUs
[    0.007669] SMP: Total of 4 processors activated.
[    0.007677] CPU features: detected: 32-bit EL0 Support
[    0.007683] CPU features: detected: 32-bit EL1 Support
[    0.007691] CPU features: detected: CRC32 instructions
[    0.015684] CPU: All CPU(s) started at EL2
[    0.015741] alternatives: patching kernel code
[    0.017279] devtmpfs: initialized
[    0.021874] KASLR disabled due to lack of seed
[    0.022055] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.022077] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.023379] pinctrl core: initialized pinctrl subsystem
[    0.024561] DMI not present or invalid.
[    0.025305] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.026965] DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations
[    0.027128] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[    0.027263] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.027341] audit: initializing netlink subsys (disabled)
[    0.027503] audit: type=2000 audit(0.024:1): state=initialized audit_enabled=0 res=1
[    0.028690] thermal_sys: Registered thermal governor 'step_wise'
[    0.028698] thermal_sys: Registered thermal governor 'power_allocator'
[    0.029049] cpuidle: using governor menu
[    0.029244] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.029356] ASID allocator initialised with 65536 entries
[    0.030989] Serial: AMBA PL011 UART driver
[    0.044413] platform 6515000.lcd-controller: Fixing up cyclic dependency with 6510000.tcon-top
[    0.044993] platform 6511000.lcd-controller: Fixing up cyclic dependency with 6510000.tcon-top
[    0.046894] platform 7022000.pinctrl: Fixing up cyclic dependency with pmic@745 (7083000.rsb)
[    0.048752] platform panel: Fixing up cyclic dependency with 6511000.lcd-controller
[    0.059503] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.059526] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[    0.059535] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.059544] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[    0.061068] ACPI: Interpreter disabled.
[    0.063423] iommu: Default domain type: Translated 
[    0.063436] iommu: DMA domain TLB invalidation policy: strict mode 
[    0.063691] vgaarb: loaded
[    0.064007] SCSI subsystem initialized
[    0.064391] usbcore: registered new interface driver usbfs
[    0.064436] usbcore: registered new interface driver hub
[    0.064470] usbcore: registered new device driver usb
[    0.065362] pps_core: LinuxPPS API ver. 1 registered
[    0.065371] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.065389] PTP clock support registered
[    0.065512] EDAC MC: Ver: 3.0.0
[    0.066947] FPGA manager framework
[    0.067036] Advanced Linux Sound Architecture Driver Initialized.
[    0.068044] clocksource: Switched to clocksource arch_sys_counter
[    0.068268] VFS: Disk quotas dquot_6.6.0
[    0.068320] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.068526] pnp: PnP ACPI: disabled
[    0.075109] NET: Registered PF_INET protocol family
[    0.075303] IP idents hash table entries: 16384 (order: 5, 131072 bytes, linear)
[    0.076110] tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes, linear)
[    0.076182] TCP established hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.076262] TCP bind hash table entries: 8192 (order: 5, 131072 bytes, linear)
[    0.076407] TCP: Hash tables configured (established 8192 bind 8192)
[    0.076510] UDP hash table entries: 512 (order: 2, 16384 bytes, linear)
[    0.076553] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes, linear)
[    0.076691] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.077069] RPC: Registered named UNIX socket transport module.
[    0.077080] RPC: Registered udp transport module.
[    0.077086] RPC: Registered tcp transport module.
[    0.077092] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.077104] PCI: CLS 0 bytes, default 64
[    0.077936] hw perfevents: enabled with armv8_cortex_a53 PMU driver, 7 counters available
[    0.078375] kvm [1]: IPA Size Limit: 40 bits
[    0.080311] kvm [1]: vgic interrupt IRQ9
[    0.080464] kvm [1]: Hyp mode initialized successfully
[    0.081777] Initialise system trusted keyrings
[    0.082040] workingset: timestamp_bits=42 max_order=18 bucket_order=0
[    0.089111] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.089837] NFS: Registering the id_resolver key type
[    0.089897] Key type id_resolver registered
[    0.089905] Key type id_legacy registered
[    0.089986] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.089995] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    0.090172] 9p: Installing v9fs 9p2000 file system support
[    0.135580] Key type asymmetric registered
[    0.135591] Asymmetric key parser 'x509' registered
[    0.135642] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
[    0.135653] io scheduler mq-deadline registered
[    0.135660] io scheduler kyber registered
[    0.148250] EINJ: ACPI disabled.
[    0.170602] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    0.173581] SuperH (H)SCI(F) driver initialized
[    0.174149] msm_serial: driver initialized
[    0.175878] cacheinfo: Unable to detect cache hierarchy for CPU 0
[    0.181121] loop: module loaded
[    0.182304] megasas: 07.719.03.00-rc1
[    0.189130] tun: Universal TUN/TAP device driver, 1.6
[    0.190095] thunder_xcv, ver 1.0
[    0.190139] thunder_bgx, ver 1.0
[    0.190178] nicpf, ver 1.0
[    0.191544] hns3: Hisilicon Ethernet Network Driver for Hip08 Family - version
[    0.191555] hns3: Copyright (c) 2017 Huawei Corporation.
[    0.191611] hclge is initializing
[    0.191636] e1000: Intel(R) PRO/1000 Network Driver
[    0.191643] e1000: Copyright (c) 1999-2006 Intel Corporation.
[    0.191687] e1000e: Intel(R) PRO/1000 Network Driver
[    0.191693] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[    0.191740] igb: Intel(R) Gigabit Ethernet Network Driver
[    0.191747] igb: Copyright (c) 2007-2014 Intel Corporation.
[    0.191782] igbvf: Intel(R) Gigabit Virtual Function Network Driver
[    0.191789] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
[    0.192167] sky2: driver version 1.30
[    0.193358] VFIO - User Level meta-driver version: 0.3
[    0.195572] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    0.195587] ehci-pci: EHCI PCI platform driver
[    0.195631] ehci-platform: EHCI generic platform driver
[    0.195790] ehci-orion: EHCI orion driver
[    0.195897] ehci-exynos: EHCI Exynos driver
[    0.195990] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    0.196015] ohci-pci: OHCI PCI platform driver
[    0.196098] ohci-platform: OHCI generic platform driver
[    0.196242] ohci-exynos: OHCI Exynos driver
[    0.196858] usbcore: registered new interface driver usb-storage
[    0.200392] sun6i-rtc 7000000.rtc: registered as rtc0
[    0.200428] sun6i-rtc 7000000.rtc: setting system clock to 1970-01-01T00:00:06 UTC (6)
[    0.200444] sun6i-rtc 7000000.rtc: RTC enabled
[    0.200829] i2c_dev: i2c /dev entries driver
[    0.207994] sdhci: Secure Digital Host Controller Interface driver
[    0.208011] sdhci: Copyright(c) Pierre Ossman
[    0.208856] Synopsys Designware Multimedia Card Interface Driver
[    0.210021] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.211501] leds-gpio: probe of leds failed with error -2
[    0.211879] ledtrig-cpu: registered to indicate activity on CPUs
[    0.214181] usbcore: registered new interface driver usbhid
[    0.214199] usbhid: USB HID core driver
[    0.221219] NET: Registered PF_PACKET protocol family
[    0.221396] 9pnet: Installing 9P2000 support
[    0.221468] Key type dns_resolver registered
[    0.221791] Loading compiled-in X.509 certificates
[    0.239301] platform 1100000.mixer: Fixing up cyclic dependency with 6510000.tcon-top
[    0.246410] sun50i-h6-r-pinctrl 7022000.pinctrl: initialized sunXi PIO driver
[    0.249564] ehci-platform 5101000.usb: EHCI Host Controller
[    0.249605] ehci-platform 5101000.usb: new USB bus registered, assigned bus number 1
[    0.249715] ehci-platform 5101000.usb: irq 36, io mem 0x05101000
[    0.264066] ehci-platform 5101000.usb: USB 2.0 started, EHCI 1.00
[    0.264739] hub 1-0:1.0: USB hub found
[    0.264774] hub 1-0:1.0: 1 port detected
[    0.267096] ehci-platform 5311000.usb: EHCI Host Controller
[    0.267129] ehci-platform 5311000.usb: new USB bus registered, assigned bus number 2
[    0.267235] ehci-platform 5311000.usb: irq 38, io mem 0x05311000
[    0.280058] ehci-platform 5311000.usb: USB 2.0 started, EHCI 1.00
[    0.280670] hub 2-0:1.0: USB hub found
[    0.280702] hub 2-0:1.0: 1 port detected
[    0.456124] ohci-platform 5101400.usb: Generic Platform OHCI controller
[    0.456171] ohci-platform 5101400.usb: new USB bus registered, assigned bus number 3
[    0.456308] ohci-platform 5101400.usb: irq 37, io mem 0x05101400
[    0.520635] hub 3-0:1.0: USB hub found
[    0.520668] hub 3-0:1.0: 1 port detected
[    0.522976] ohci-platform 5311400.usb: Generic Platform OHCI controller
[    0.523010] ohci-platform 5311400.usb: new USB bus registered, assigned bus number 4
[    0.523133] ohci-platform 5311400.usb: irq 39, io mem 0x05311400
[    0.584671] hub 4-0:1.0: USB hub found
[    0.584705] hub 4-0:1.0: 1 port detected
[    0.587241] usb_phy_generic usb_phy_generic.1.auto: supply vcc not found, using dummy regulator
[    0.587427] usb_phy_generic usb_phy_generic.1.auto: dummy supplies not allowed for exclusive requests
[    0.664275] musb-hdrc musb-hdrc.2.auto: MUSB HDRC host driver
[    0.664304] musb-hdrc musb-hdrc.2.auto: new USB bus registered, assigned bus number 5
[    0.664885] hub 5-0:1.0: USB hub found
[    0.664921] hub 5-0:1.0: 1 port detected
[    0.673926] sun50i-h6-r-pinctrl 7022000.pinctrl: supply vcc-pl not found, using dummy regulator
[    0.674299] sunxi-rsb 7083000.rsb: RSB running at 3000000 Hz
[    0.674739] axp20x-rsb sunxi-rsb-745: AXP20x variant AXP806 found
[    0.677660] vdd-sys: Bringing 900000uV into 960000-960000uV
[    0.678369] vcc-ac200: Bringing 700000uV into 3300000-3300000uV
[    0.678630] vcc25-dram: Bringing 700000uV into 3300000-3300000uV
[    0.679372] vcc-dcxoio: Bringing 700000uV into 1800000-1800000uV
[    0.680156] vcc-wifi-1: Bringing 700000uV into 3300000-3300000uV
[    0.680431] vcc-wifi-2: Bringing 700000uV into 3300000-3300000uV
[    0.680865] axp20x-rsb sunxi-rsb-745: AXP20X driver loaded
[    0.686413] sun50i-h6-pinctrl 300b000.pinctrl: initialized sunXi PIO driver
[    0.687911] sun50i-h6-pinctrl 300b000.pinctrl: supply vcc-ph not found, using dummy regulator
[    0.688523] printk: console [ttyS0] disabled
[    0.708947] 5000000.serial: ttyS0 at MMIO 0x5000000 (irq = 34, base_baud = 1500000) is a 16550A
[    2.080218] printk: console [ttyS0] enabled
[    2.087924] ALSA device list:
[    2.089592] sun50i-h6-pinctrl 300b000.pinctrl: supply vcc-pf not found, using dummy regulator
[    2.090948]   No soundcards found.
[    2.100299] sunxi-mmc 4020000.mmc: Got CD GPIO
[    2.132842] sunxi-mmc 4020000.mmc: initialized, max. request size: 16384 KB, uses new timings mode
[    2.141994] Waiting for root device /dev/mmcblk0p2...
[    2.176604] mmc0: host does not support reading read-only switch, assuming write-enable
[    2.186550] mmc0: new high speed SDHC card at address 0007
[    2.192680] mmcblk0: mmc0:0007 SD4GB 3.71 GiB 
[    2.199129]  mmcblk0: p1 p2
[    2.215454] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Quota mode: none.
[    2.224091] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
[    2.231723] devtmpfs: mounted
[    2.237376] Freeing unused kernel memory: 6528K
[    2.242036] Run /sbin/init as init process
[    2.537467] EXT4-fs (mmcblk0p2): re-mounted. Quota mode: none.
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Saving random seed: [    2.625129] random: dd: uninitialized urandom read (32 bytes read)
OK
Starting network: [    2.971653] NET: Registered PF_INET6 protocol family
[    2.977676] Segment Routing with IPv6
[    2.981418] In-situ OAM (IOAM) with IPv6
OK

Welcome to CustomBoard
buildroot login: root
#

Мигаем светодиодом.
Проверяем что /sys/class/leds включен в конфиге ядра.
Открываем конфиг:

host@host:~/my_dev/buildroot/buildroot-2022.05$ make linux-menuconfig

Включаем поддержку LED

-> Device Drivers
    -> LED Support
      <*> LED Class Support

Прописываем LED в device tree:

~/my_dev/buildroot/buildroot-2022.05/output/build/linux-5.17.13/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts
...
        leds {
                compatible = "gpio-leds";

                heartbeat {
                        label = "my_board:green:heartbeat";
                        gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>;/* PL2 */
                };

        };
...

Ребилдим ядро и бинарь:

host@host:~/my_dev/buildroot/buildroot-2022.05$ make linux-rebuild
host@host:~/my_dev/buildroot/buildroot-2022.05$ make

Заливаем на карту. Подключаем консоль через USB-UART переходник . Запускаем minicom. Логин root, пароль - пустой. Активируем светодиод:

# echo heartbeat > /sys/class/leds/my_board:green:heartbeat/trigger

Что дальше

Для вывода изображения на дисплей необходимо доработать графическую подсистему ядра - DRM/KMS, в device tree добавить объекты lcd controller и panel. На данный момент под этот процессор реализован только вывод на HDMI. Также нужно добавить драйвер WIFI для AP6212.

Комментарии (18)


  1. Sergey78
    06.10.2022 21:28
    +5

    Спасибо, за статью и за ссылку на статью :)

    То же иногда смотрю в сторону сделать свою плату но пугает ddr и замороченная схема питания. И отсутствие самих МК и документации от производителя. У STM с документацией обычно хорошо и схемы их плат есть, но stm32mp1 в более-менее свободной продаже (lcsc и т.д.) не встречал.

    У китайцев бывают миниатюрные модули МК+ddr+питальник. Видел и с allwiner-рами и с stm32, под запайку в свою плату. Но ценник какой-то неадекватный. Видимо не очень популярное решение.

    У allwiner-а (и вроде ещё у кого-то) встречал вообще в выводном корпусе. У кого-то видел даже МК с ram внутри корпуса. 64Мб, но мне бы скорее всего хватило. Только datasheet на десяток страниц, никакого hardware integrating manual и не купить.


    1. order227
      07.10.2022 11:09
      +2

      но stm32mp1
      Даже не смотрите на него, этот чип спроектировали идиоты или студенты из Индии. Там классический убогий pinout от st, как будто старались сделать максимально плохо.

      Саму же трассировку DDR3 не бойтесь, на таких длинах цепей она заведется в любом случае даже если нарушить половину правил. Если же все сделать по мануалу (производитель дает обычно прям табличку с правилами), то все полетит на максимальной скорости.

      Если хочется сделать свою плату, то посмотрите на NXP i.MX6 чипы, под них что-то проектировать одно удовольствие + их можно купить при желании, вроде даже на алиэкспресс брали знакомые.


    1. tehniksit Автор
      07.10.2022 12:26

      Глаза боятся, руки делают :)
      Главное правильно подключить, остальное дело техники. Во всяком случае для начала. Всегда можно в последующих итерациях доработать, улучшить. Так конечно трассировка DDR комплексная тема, если делать все по канонам.

      STM мне очень нравится. Работал с их МК профессионально. Как только узнал что они и SOC делают, выбор был очевиден. Даже несмотря на то, что они слегка проигрывают по характеристикам в категории микропроцессоров.

      Использовать SoM, где уже есть разведенные проц-память-питание, решение весьма практичное. Для небольшого реального проекта - точно. Их проще как то официально достать. Не через алиэкспрессы. Сильно меньше проблем с разработкой платы. Меньше слоев в плате для конечного продукта. Остается только кастомизация. Убежден, что будет дешевле. У меня же вопрос цены и надежности не стоял, идея была сделать с нуля самому.


      1. order227
        07.10.2022 23:08

        Всегда можно в последующих итерациях доработать
        Сейчас бы в 2022-м ошибаться над DDR3/4 при работе с SoC :)) По канонам даже сам производитель не описывает в своих гайдах, это избыточно в нынешних реалиях.

        Работал с их МК профессионально
        МК у них норм, если не брать во внимание убогие pinout-ы, когда QSPI разбросан на все 4 стороны LQFP-176. А вот SoC у них дрянь вышли, видимо поэтому они ничего нового больше не выкатили, популярность нулевая, стоят дорого, многие их заслуженно ругают.

        Использовать SoM
        Если габариты позволяют, то в принципе вариант нормальный. Есть отечественный производитель starterkit.ru или как-то так, у них очень вкусные решения в виде sodimm и mPCI карточек за очень адекватные прайс типа 2-3 тыс руб. Хотя сейчас возможно все поменялось ввиду последних событий


  1. John_Cena
    07.10.2022 12:31

    Неплохо довольно получилось.

    А память это lpddr3 или lpddr4? От частоты работы памяти сильно зависят допуски при выравнивании длин проводников, соответственно утверждение о том, что с выравниванием можно не заморачиваться верно не всегда.


    1. tehniksit Автор
      07.10.2022 12:32

      Память LPDDR3


    1. order227
      07.10.2022 22:54

      верно не всегда
      Ровно до момента пока линия электрически короткая, а если памяти всего 1 чип, то это вообще не проблема обеспечить. Да и современные контроллеры DDR внутри SoC прощают ооочень многое, по сути главное в схеме не ошибиться.


  1. predbannikov_yurij
    07.10.2022 12:47

    А зачем нужен процесс пайки? Я имел дело с платой orange pi lite, но там процессор и память уже были на месте.


  1. J0k3Rnc
    07.10.2022 12:47
    +1

    А как понимаю с х86 почти глухо все как и было год назад?


  1. PavelTolkachov
    07.10.2022 13:26

    Тоже часто задумываюсь над созданием такой платы, с целью создания своего принтсервера для старых usb МФУ.


  1. sshmshk
    07.10.2022 14:14

    Здаравствуйте, могу ли я попросить ссылку на объявление в котором Вы заказывали изготовление печатных плат через Алиекспресс?


    1. tehniksit Автор
      07.10.2022 14:18
      +1

      Заказывал на jlcpcb. Плата должна пройти ревью, уже после они сообщают итоговую стоимость и дают ссылку на магазин алиэкспресс для оплаты.


      1. DmitryVS
        07.10.2022 17:00
        +1

        JLCPCB наладил человеческую оплату карточками российских банков. Счёт выставляют сразу в рублях. Оплата идёт через какой-то свой китайсткий редирект на гейт юмани. Трафареты для пасты делают. Заказ размещал пару недель назад. И оплата после ревью не обязательно, я никогда этой опцией не пользовался. Хотя, с 6-ти слойкой в первый раз, наверное имеет смысл.


  1. agalakhov
    07.10.2022 19:25

    Какой там шаг шаров BGA и какого диаметра использовали переходные отверстия? Насколько я помню, у JLCPCB довольно трудно уложиться в техпроцесс.


    1. tehniksit Автор
      08.10.2022 12:34

      Allwinner H6 шаг - 0.65мм.

      Использовал via - 0.2мм, trace - 0.09мм. Это минимально допустимые для 4-6 слоев у jlcpcb.

      Несколько раз отправляли на доработку. Шаг 0.65мм, расстояние между шарами 0.325мм Менеджеры упорно доказывали, что необходимо сделать clearance 0.2mm. Еще по какой-то причине не совпадали значения clearance в их и моем ПО. Делал 0.09, они показывают что 0.076мм. Слегка подвигал, приняли.


  1. RV3EFE
    07.10.2022 23:29

    А проблем с доками на alwinner не было? На официальном сайте с ними туго.


    1. tehniksit Автор
      08.10.2022 12:39
      +1

      Только это:

      Allwinner_H6_V200_Datasheet_V1.1.pdf
      Allwinner_H6_V200_User_Manual_V1.1.pdf

      Остальное - схемы референсных плат.


      1. RV3EFE
        08.10.2022 19:29

        Понятно. Я аналогично с allwinner работал. Ещё при официальной покупке у них, они отправляют на продажника, который иногда может предоставить доки и референсы.