Raspberry PI3 (ARMv8 или ARMv7) Cortex-A53, первый bare metal

Итак как установить нужный toolchain для ARM Cortex A53 (raspberry PI3 v1.2) мы рассказали ранее. Процессор BCM2837.

Мы использовали пакет gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-elf.tar.xz и make3.81.exe (будем собирать проект через makefile).

Теперь настало время собрать один проект (самый простой) выводим Hello world в Uart (Raspberry PI3) на bare metal .

Для начала изучаем куда куда нам можно подключится на raspberry PI3 , чтобы по UART увидеть какой-то обмен/ Обратите внимание это порт : mini-UART.

фотка 1

Есть еще UART0. Похпоже у UART0 и у mini-UART одни и те же выходные пины?..
По умолчанию mini-UART отключен. Чтобы его включить надо в config.txt записать enable_uart=1.

На всякий случай пины гребенки Raspberry pi3 :

фотка 2

Далее берем любой дистрибутив ОС raspbian для rasberry PI3 на микро сд и обращаем внимание , что первый раздел микро сд в FAT , поэтому и под windows нормально читается :

фотка 3

На начальном этапе когда еще мало опыта работы с распберри , надо обращать внимание на мигание светодиодов при загрузке:

Raspberry PI 3 v1.2 имеет два светодиода - PWT(red) и ACT (green). Ниже показаны мигания зеленого ACT при ошибках.


Long 	Short 	Status
0		3		Generic failure to boot
0		4		start*.elf not found  
- проверили точно : зел. горит 2 сек., потом тухнет и 4 коротких мига (0.5сек), потом опять зел. загорается и все повторяется
0		7		Kernel image not found
0		8		SDRAM failure
0		9		Insufficient SDRAM
0		10		In HALT state
2		1		Partition not FAT
2		2		Failed to read from partition
2		3		Extended partition not FAT
2		4		File signature/hash mismatch - Pi 4
4		4		Unsupported board type
4		5		Fatal firmware error
4		6		Power failure type A
4		7		Power failure type B

И оказывается есть большой нюанс в Raspberry pi3 : чтобы использовать консоль UART0 надо отключить блютуз, так как последний использует UART0. Странно но у UART0 и у mini-UART одни и те же выходные пины.

Чтобы отключить BT и нормально заработала консоль через UART0 надо в файле config.txt прописать dtoverlay=disable-bt .


11.031551] sysrq: Resetting
[ 11.035399] CPU0: stopping
[ 11.039396] CPU3: stopping
[ 11.043368] CPU1: stopping
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.4.83-v7+ (dom@buildbot) (gcc version 8.4.0 (Ubuntu/Linaro 8.4.0-3ubuntu1)) #1379 SMP Mon Dec 14 13:08:57 GMT 2020
[ 0.000000] CPU: ARMv7 Processor [410fd034] revision 4 (ARMv7), cr=10c5383d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Raspberry Pi 3 Model B Rev 1.2
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] Reserved memory: created CMA memory pool at 0x37400000, size 64 MiB
[ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[ 0.000000] percpu: Embedded 20 pages/cpu s49740 r8192 d23988 u81920
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 240555
[ 0.000000] Kernel command line: coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyAMA0,115200 console=tty1 root=PARTUUID=8d3d20fc-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] Memory: 880480K/970752K available (9216K kernel code, 698K rwdata, 2608K rodata, 1024K init, 827K bss, 24736K reserved, 65536K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.000000] ftrace: allocating 29205 entries in 58 pages
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[ 0.000000] random: get_random_bytes called from start_kernel+0x324/0x4f8 with crng_init=0
[ 0.000000] arch_timer: cp15 timer(s) running at 19.20MHz (phys).
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x46d987e47, max_idle_ns: 440795202767 ns
[ 0.000007] sched_clock: 56 bits at 19MHz, resolution 52ns, wraps every 4398046511078ns
[ 0.000020] Switching to timer-based delay loop, resolution 52ns
[ 0.000287] Console: colour dummy device 80x30
[ 0.000879] printk: console [tty1] enabled
[ 0.000949] Calibrating delay loop (skipped), value calculated using timer frequency.. 38.40 BogoMIPS (lpj=192000)
[ 0.000998] pid_max: default: 32768 minimum: 301
[ 0.001202] LSM: Security Framework initializing
[ 0.001438] Mount-cache hash table entries: 2048 (order: 1, 8192 bytes, linear)
[ 0.001485] Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes, linear)
[ 0.002950] Disabling memory control group subsystem
[ 0.003091] CPU: Testing write buffer coherency: ok
[ 0.003675] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[ 0.004636] Setting up static identity map for 0x100000 - 0x10003c
[ 0.004855] rcu: Hierarchical SRCU implementation.
[ 0.005555] smp: Bringing up secondary CPUs ...
[ 0.006695] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[ 0.007973] CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
[ 0.009135] CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
[ 0.009289] smp: Brought up 1 node, 4 CPUs
[ 0.009380] SMP: Total of 4 processors activated (153.60 BogoMIPS).
[ 0.009409] CPU: All CPU(s) started in HYP mode.
[ 0.009434] CPU: Virtualization extensions available.
[ 0.010535] devtmpfs: initialized
[ 0.026556] VFP support v0.3: implementor 41 architecture 3 part 40 variant 3 rev 4
[ 0.026853] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.026910] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[ 0.030283] pinctrl core: initialized pinctrl subsystem
[ 0.031411] NET: Registered protocol family 16
[ 0.035614] DMA: preallocated 1024 KiB pool for atomic coherent allocations
[ 0.040419] audit: initializing netlink subsys (disabled)
[ 0.040714] audit: type=2000 audit(0.040:1): state=initialized audit_enabled=0 res=1
[ 0.042080] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[ 0.042120] hw-breakpoint: maximum watchpoint size is 8 bytes.
[ 0.042353] Serial: AMBA PL011 UART driver
[ 0.044326] bcm2835-mbox 3f00b880.mailbox: mailbox enabled
[ 0.060085] raspberrypi-firmware soc:firmware: Attached to firmware from 2021-01-08 14:33, variant start
[ 0.070099] raspberrypi-firmware soc:firmware: Firmware hash is 194a85abd768c7334bbadc3f1911c10a7d18ed14
[ 0.121570] bcm2835-dma 3f007000.dma: DMA legacy API manager, dmachans=0x1
[ 0.123763] SCSI subsystem initialized
[ 0.124024] usbcore: registered new interface driver usbfs
[ 0.124105] usbcore: registered new interface driver hub
[ 0.124261] usbcore: registered new device driver usb
[ 0.126129] clocksource: Switched to clocksource arch_sys_counter
[ 1.384298] VFS: Disk quotas dquot_6.6.0
[ 1.384435] VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[ 1.384652] FS-Cache: Loaded
[ 1.384941] CacheFiles: Loaded
[ 1.396281] thermal_sys: Registered thermal governor 'step_wise'
[ 1.396666] NET: Registered protocol family 2
[ 1.397685] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear)
[ 1.397759] TCP established hash table entries: 8192 (order: 3, 32768 bytes, linear)
[ 1.397900] TCP bind hash table entries: 8192 (order: 4, 65536 bytes, linear)
[ 1.398110] TCP: Hash tables configured (established 8192 bind 8192)
[ 1.398294] UDP hash table entries: 512 (order: 2, 16384 bytes, linear)
[ 1.398368] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes, linear)
[ 1.398678] NET: Registered protocol family 1
[ 1.399472] RPC: Registered named UNIX socket transport module.
[ 1.399504] RPC: Registered udp transport module.
[ 1.399531] RPC: Registered tcp transport module.
[ 1.399557] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 1.401220] hw perfevents: enabled with armv7_cortex_a7 PMU driver, 7 counters available
[ 1.404549] Initialise system trusted keyrings
[ 1.404822] workingset: timestamp_bits=14 max_order=18 bucket_order=4
[ 1.416379] FS-Cache: Netfs 'nfs' registered for caching
[ 1.417307] NFS: Registering the id_resolver key type
[ 1.417362] Key type id_resolver registered
[ 1.417389] Key type id_legacy registered
[ 1.417425] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[ 1.418726] Key type asymmetric registered
[ 1.418756] Asymmetric key parser 'x509' registered
[ 1.418837] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 249)
[ 1.418875] io scheduler mq-deadline registered
[ 1.418902] io scheduler kyber registered
[ 1.423923] bcm2708_fb soc:fb: FB found 1 display(s)
[ 1.435631] Console: switching to colour frame buffer device 82x26
[ 1.442753] bcm2708_fb soc:fb: Registered framebuffer for display 0, size 656x416
[ 1.451162] Serial: 8250/16550 driver, 1 ports, IRQ sharing enabled
[ 1.455936] bcm2835-rng 3f104000.rng: hwrng registered
[ 1.459055] vc-mem: phys_addr:0x00000000 mem_base=0x3ec00000 mem_size:0x40000000(1024 MiB)
[ 1.464824] vc-sm: Videocore shared memory driver
[ 1.467937] gpiomem-bcm2835 3f200000.gpiomem: Initialised: Registers at 0x3f200000
[ 1.485771] brd: module loaded
[ 1.500704] loop: module loaded
[ 1.504688] Loading iSCSI transport class v2.0-870.
[ 1.508318] libphy: Fixed MDIO Bus: probed
[ 1.511020] usbcore: registered new interface driver lan78xx
[ 1.513727] usbcore: registered new interface driver smsc95xx
[ 1.516319] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[ 2.247042] Core Release: 2.80a
[ 2.249503] Setting default values for core params
[ 2.252038] Finished setting default values for core params
[ 2.454941] Using Buffer DMA mode
[ 2.457451] Periodic Transfer Interrupt Enhancement - disabled
[ 2.459972] Multiprocessor Interrupt Enhancement - disabled
[ 2.462441] OTG VER PARAM: 0, OTG VER FLAG: 0
[ 2.464867] Dedicated Tx FIFOs mode
[ 2.467797] WARN::dwc_otg_hcd_init:1074: FIQ DMA bounce buffers: virt = b7504000 dma = 0xf7504000 len=9024
[ 2.472537] FIQ FSM acceleration enabled for :
[ 2.472537] Non-periodic Split Transactions
[ 2.472537] Periodic Split Transactions
[ 2.472537] High-Speed Isochronous Endpoints
[ 2.472537] Interrupt/Control Split Transaction hack enabled
[ 2.483752] WARN::hcd_init_fiq:457: FIQ on core 1
[ 2.486009] WARN::hcd_init_fiq:458: FIQ ASM at 8070bf24 length 36
[ 2.488272] WARN::hcd_init_fiq:497: MPHI regs_base at bb810000
[ 2.490506] dwc_otg 3f980000.usb: DWC OTG Controller
[ 2.492831] dwc_otg 3f980000.usb: new USB bus registered, assigned bus number 1
[ 2.495211] dwc_otg 3f980000.usb: irq 56, io mem 0x00000000
[ 2.497555] Init: Port Power? op_state=1
[ 2.499813] Init: Power Port (0)
[ 2.502356] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.04
[ 2.506929] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 2.509364] usb usb1: Product: DWC OTG Controller
[ 2.511749] usb usb1: Manufacturer: Linux 5.4.83-v7+ dwc_otg_hcd
[ 2.514186] usb usb1: SerialNumber: 3f980000.usb
[ 2.517283] hub 1-0:1.0: USB hub found
[ 2.519599] hub 1-0:1.0: 1 port detected
[ 2.522912] usbcore: registered new interface driver usb-storage
[ 2.525413] mousedev: PS/2 mouse device common for all mice
[ 2.528964] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
[ 2.534120] sdhci: Secure Digital Host Controller Interface driver
[ 2.536597] sdhci: Copyright(c) Pierre Ossman
[ 2.539560] mmc-bcm2835 3f300000.mmcnr: could not get clk, deferring probe
[ 2.542708] sdhost-bcm2835 3f202000.mmc: could not get clk, deferring probe
[ 2.545521] sdhci-pltfm: SDHCI platform and OF driver helper
[ 2.549933] ledtrig-cpu: registered to indicate activity on CPUs
[ 2.552906] hidraw: raw HID events driver (C) Jiri Kosina
[ 2.555702] usbcore: registered new interface driver usbhid
[ 2.558333] usbhid: USB HID core driver
[ 2.561944] vchiq: vchiq_init_state: slot_zero = (ptrval)
[ 2.566278] [vc_sm_connected_init]: start
[ 2.575011] [vc_sm_connected_init]: end - returning 0
[ 2.579448] Initializing XFRM netlink socket
[ 2.581840] NET: Registered protocol family 17
[ 2.584310] Key type dns_resolver registered
[ 2.587282] Registering SWP/SWPB emulation handler
[ 2.589939] registered taskstats version 1
[ 2.592319] Loading compiled-in X.509 certificates
[ 2.595199] Key type ._fscrypt registered
[ 2.597555] Key type .fscrypt registered
[ 2.610283] uart-pl011 3f201000.serial: cts_event_workaround enabled
[ 2.612697] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 81, base_baud = 0) is a PL011 rev2
[ 3.604946] printk: console [ttyAMA0] enabled
[ 3.613917] bcm2835-power bcm2835-power: Broadcom BCM2835 power domains driver
[ 3.625091] mmc-bcm2835 3f300000.mmcnr: mmc_debug:0 mmc_debug2:0
[ 3.633473] mmc-bcm2835 3f300000.mmcnr: DMA channel allocated
[ 3.667827] sdhost: log_buf @ (ptrval) (f7507000)
[ 3.710484] mmc1: queuing unknown CIS tuple 0x80 (2 bytes)
[ 3.718471] Indeed it is in host mode hprt0 = 00021501
[ 3.787291] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[ 3.796172] mmc0: sdhost-bcm2835 loaded - DMA enabled (>1)
[ 3.805559] random: fast init done
[ 3.806652] of_cfs_init
[ 3.816263] of_cfs_init: OK
[ 3.822287] Waiting for root device PARTUUID=8d3d20fc-02...
[ 3.824755] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[ 3.843314] mmc1: queuing unknown CIS tuple 0x80 (7 bytes)
[ 3.911482] mmc0: host does not support reading read-only switch, assuming write-enable
[ 3.930324] mmc0: new high speed SDHC card at address aaaa
[ 3.938319] usb 1-1: new high-speed USB device number 2 using dwc_otg
[ 3.947583] Indeed it is in host mode hprt0 = 00001101
[ 4.015910] mmcblk0: mmc0:aaaa SC16G 14.8 GiB
[ 4.028323] mmcblk0: p1 p2
[ 4.049210] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 4.062118] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
[ [ 5.247391] uart-pl011 3f201000.serial: no DMA platform data
[ 5.892752] random: systemd: uninitialized urandom read (16 bytes read)
[ 5.917648] random: systemd: uninitialized urandom read (16 bytes read)
[ 5.928169] systemd[1]: Listening on fsck to fsckd communication Socket.
[ 5.944749] systemd[1]: Created slice system-systemd\x2dfsck.slice.
[ 5.957703] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[ 5.975878] systemd[1]: Created slice system-getty.slice.
[ 5.988113] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
 
 Raspbian GNU/Linux 10 raspberrypi ttyAMA0
 
raspberrypi login:

И тут заметили , что у нас похоже CPU: ARMv7 Processor и BCM2835 , а мы думали у нас BCM2837 ARMv8 64 разрядный. Как такое может быть, кому верить?..

На процессоре приклеен кулер, посмотреть процессор затруднительно... На плате написано Raspberry PI 3 Model B ver 1.2 2015 .

Даже сделано попытка отклеить кулер , но стало жалко , можно снести процессор, так как приклеен кулер хорошо.

Единственно , что смущает еще это скачанный дистрибутив : Raspberry Pi OS LITE(32-bit) , он явно 32 разрядный.

И вот еще одна маленькая деталь , если посмотреть внимательно на плату еще раз , то есть еще надписи :
FCC ID: 3ABCB-RPI32
IC 20953-RPI32

Проверяем по IC 20953-RPI32. находим CPU1: Broadcom BCM2837 ?...

Далее вам понадобится знание login и password суперпользователя.

Пароли по умолчанию для разных дистрибутивов :


Arch Linux ARM 		root 	root
Debian  			pi 		raspberry
DietPi 				root 	dietpi
Kali Linux 			root 	toor
Lakka Linux 		root 	root
LibreELEC 			root 	libreelec
OpenELEC 			root 	openelec
OSMC 				osmc 	osmc
QtonPi 			root 	rootme
Raspberry Pi OS (Raspbian) 	pi 	raspberry
RasPlex 			pi 	rasplex
Retropie 			pi 		raspberry
ROKOS 				rokos 	rokos
Ubuntu Server 		ubuntu 	ubuntu

Вопрос принципиальный : какая архитектура у нас ARMv7 32 или ARMv8 64?

Скачиваем образ Ubuntu server 64 разрядный (десктоп есть только 32 разрядный для pi3). Это должно пролить свет.

Логинимся по TCP через программу например putty, login : ubuntu, пароль ubuntu. И видим сразу :

You are required to change your password immediately (administrator enforced)
Welcome to Ubuntu 20.10 (GNU/Linux 5.8.0-1006-raspi aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon Feb  8 15:19:23 UTC 2021

  System load:  0.08               Temperature:           41.3 C
  Usage of /:   14.1% of 14.29GB   Processes:             133
  Memory usage: 28%                Users logged in:       0
  Swap usage:   0%                 IPv4 address for eth0: 192.168.1.177

0 updates can be installed immediately.
0 of these updates are security updates.

The list of available updates is more than a week old.
To check for new updates run: sudo apt update

aarch64 - явно мы в 64 разрябном режиме.

Теперь как посмотреть информацию о чипе / ядрах / процессоре / режиме под ubuntu - cat /proc/cpuinfo :


ubuntu@ubuntu:~$ cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

Hardware        : BCM2835
Revision        : a22082
Serial          : 00000000555619ad
Model           : Raspberry Pi 3 Model B Rev 1.2

CPU architecture: 8
Hardware : BCM2835
Model : Raspberry Pi 3 Model B Rev 1.2

Команда nproc возвращает 4 , то есть у нас 4 ядра . А у BCM2835 одно ядро. Тут явно что-то не так. Или так и должно быть?... Есть упоминание о этой ситуации на https://www.raspberrypi.org/forums/viewtopic.php?t=190329 .
Похоже все-таки у нас BCM2837 4 ядерный , но ubuntu 64 server показывает BCM2835 (4 ядра) и это нормально!... Не верьте всему , что видите.

Ну в довесок , чтобы стало еще интереснее запускаем Raspberry Pi OS LITE (32-bit) и смотрим cat /proc/cpuinfo :


cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
 
processor : 1
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
 
processor : 2
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
 
processor : 3
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
 
Hardware : BCM2835
Revision : a22082
Serial : 00000000555619ad
Model : Raspberry Pi 3 Model B Rev 1.2

Таким образом мы (по нашему мнению) имеем BCM2837 4 ядерный 64 разрядный, но он может запускаться в режиме ARMv7 32 и в ARMv8 64, в зависимости от установленной ОС на мирко СД.

Почему для нас важно какой у нас процессор , какая архитерура и т.д. Потому , что далее мы собираемся попробовать собрать bare metal код и тут надо четко понимать с чем ты имеешь дело.

Маленький экспиремент :
Берем Raspberry Pi OS LITE (32-bit) и переименовываем файл kernel8.img и загрузка ОС норм. То есть грузится образ не kernel8.img (ARMv8 64).

Далее ракручиваем какой образ у нас грузится , в помощь таблица :

Filename Processor Raspberry Pi model Notes
kernel.img BCM2835 Pi Zero, Pi 1
kernel7.img BCM2836, BCM2837 Pi 2, Pi 3 Later Pi 2 uses the BCM2837
kernel7l.img BCM2711 Pi 4 Large Physical Address Extension (LPAE)
kernel8.img BCM2837, BCM2711 Pi 2, Pi 3, Pi 4 Beta 64 bit kernel1. Earlier Pi 2 with BCM2836 do not support 64-bit.

Переименовываем файл kernel7l.img и ОС опять нормально запускается.

Попробуем поиграть с gpio . Для этого в config.txt надо добавить примерно следующее:


enable_jtag_gpio=1
gpio=21,16,7,25=op,dh
gpio=20,12,8=op,dl

И это срабатывает нормально , напряжение на выходах меняется соответсвенно указанным.

Информация по gpio :


#	ip - Input
#	op - Output
#	a0-a5 - Alt0-Alt5
#	dh - Driving high (for outputs)
#	dl - Driving low (for outputs)
#	pu - Pull up
#	pd - Pull down
#	pn/np - No pull

И вот теперь только мы подходим к программированию bare-metal с минимальным нужным багажом знаний.

bare metal на распберри пи3

Итак допустим мы установили на микро СД Raspberry Pi OS LITE(32-bit) и мы уже поняли ,что у нас грузится kernel7.img. А это режим с архитектурой Arm7v , 32 разряда , 4 ядра.

Чтобы понять , какие из файлов реально нужны мы перемещаем в отдельные каталоги по одному или несколько файлов с микро СД и смотрим как запускается ОС.

В результате нам надо оставить только :
bootcode.bin (он стартует всегда первым),
start.elf его bootcode.bin грузит в GPU
config.txt это аналог биоса , где прописаны настройки , которые использует bootcode.bin при загрузке ОС
kernel7.img это сам образ линакс
fixup.dat это что-то связанно с настройкой использования памяти

К тому же еще остаются нужными для загрузки Raspberry Pi OS LITE(32-bit):
bcm2710-rpi-3-b.dtb

При этом минимуме Raspberry Pi OS LITE(32-bit) нормально стартует и выводит в UART порт логи с нормальной загрузкой.

Теперь мы подходим в вопросу - как запустить первый bare metal . Мы перепробовали вроде 2 варианта с гитхаба rpi3-fosdem17-master и baremetal-rpi-master и не могли понять почему не работает. Потом скачали raspberrypi-master и то ли так совпало , то ли знания уже накопились нужные , но оказалось надо было сделать так :

bootcode.bin отставляем естественно от Raspberry Pi OS LITE(32-bit)
start.elf отставляем естественно от Raspberry Pi OS LITE(32-bit)
config.txt !!! просто делаем чистым !!!!
kernel7.img его заменяем нашей программой , проект : raspberrypi-master\boards\pi3\aarch32\bootloader07
fixup.dat отставляем естественно от Raspberry Pi OS LITE(32-bit)

И чудо случилось! В UART прилетели байты :


12345678
002002F8
200001DA
00C50838
IHEX

Основная проблема была в том , что для 32 разрядного варианта использовали в config.txt такие настройки:

arm_control=0x200  // это все только для arch64
kernel_old=1
disable_commandline_tags=1