[성공] pcDuino에서 FreeBSD 其弶

이전 시도 안 되었으므로 다시 확인해 보았습니다.

ZRouter에 빌드의 설정이 퍼져있기 때문에, 일단 빌드를 흘리면, arm.arm과 같이 clang의 에러로 걸리므로 Makefile.inc1에 패치를 맞추어 보겠습니다.

커널 링크에서 xz와 이전에 사용한 EARYPRINTF에서 오류가 발생했기 때문에 ZRouter의 mk 파일을 수정합니다.

이제 kernel과 rootfs를 만들었습니다.

이전 시도했을 때의 순서로 u-boot를 SD에 구워 tftp로 커널을 메모리에 로드해 시험해 보겠습니다.

ELF도 시도했지만 ELF가 시작할 수있는 u-boot에서도 링커 스크립트에 의존 해 버리기 때문에 binary를 이용하는 것이 안전합니다.

바이너리로 만드는 elfcopy는 버그가 있기 때문에 pkg의 gnu objcopy를 사용합니다. ZRouter의 변환 처리 명령은 Makefile 변수를 재정의 할 수 있으므로이를 사용합니다.

완성된 커널의 elf 파일을 objdump -D로 확인해 보겠습니다.
Pcduino_Lite_kernel:     file format elf32-littlearm


Disassembly of section .note.gnu.build-id:

c0200154 <.note.gnu.build-id>:
c0200154:       00000004        andeq   r0, r0, r4
c0200158:       00000014        andeq   r0, r0, r4, lsl r0
c020015c:       00000003        andeq   r0, r0, r3
c0200160:       00554e47        subseq  r4, r5, r7, asr #28
c0200164:       dcee33f1        stclle  3, cr3, [lr], #964      ; 0x3c4
c0200168:       fa150b00        blx     c0742d70 <_end+0x15ad70>
c020016c:       6539d3b7        ldrvs   sp, [r9, #-951]!        ; 0xfffffc49
c0200170:       ee92233f        mrc     3, 4, r2, cr2, cr15, {1}
c0200174:       c535863b        ldrgt   r8, [r5, #-1595]!       ; 0xfffff9c5

Disassembly of section .text:

c0200180 <_start>:
c0200180:       f10c01c0        cpsid   aif
c0200184:       e1a08000        mov     r8, r0
c0200188:       e1a09001        mov     r9, r1
c020018c:       e1a0a002        mov     sl, r2
c0200190:       e1a0b003        mov     fp, r3
c0200194:       e10f0000        mrs     r0, CPSR
c0200198:       e200001f        and     r0, r0, #31
c020019c:       e330001a        teq     r0, #26

.note.gnu.build-id라는 섹션이 맨 앞에 있습니다. 이 경우 objcopy에서 binary로 했을 때 load address가 0x40200154가 되고 entory address가 0x40200180이 됩니다. 이 경우는 지금까지 없었습니다.

load address와 entory address를 설정하여 u-boot 이미지를 만들어 보았습니다.
% file Pcduino_Lite_kernel.kbin.gz.uboot
Pcduino_Lite_kernel.kbin.gz.uboot: u-boot legacy uImage, FreeBSD Kernel Image, L
inux/ARM, OS Kernel Image (gzip), 1686101 bytes, Wed Apr 10 23:18:19 2019, Load 
Address: 0x40200154, Entry Point: 0x40200180, Header CRC: 0x0F172431, Data CRC: 
0x68D8B48A

boot했지만 떨어집니다.
=> tftpboot 0x41000000 Pcduino_Lite_kernel.kbin.gz.uboot
Using ethernet@1c0b000 device
TFTP from server 10.10.10.3; our IP address is 10.10.10.111
Filename 'Pcduino_Lite_kernel.kbin.gz.uboot'.
Load address: 0x41000000
Loading: #################################################################
         ##################################################
         5.3 MiB/s
done
Bytes transferred = 1686165 (19ba95 hex)
=> bootm
## Booting kernel from Legacy Image at 41000000 ...
   Image Name:   FreeBSD Kernel Image
   Image Type:   ARM Linux Kernel Image (gzip compressed)
   Data Size:    1686101 Bytes = 1.6 MiB
   Load Address: 40200154
   Entry Point:  40200180
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

Starting kernel ...

---<<BOOT>>---
ARM Debug Architecture not supported
KDB: debugger backends: ddb
KDB: current backend: ddb
Copyright (c) 1992-2019 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 13.0-CURRENT #2 a34b1232771(zrouter)-dirty: Thu Apr 11 08:18:16 JST 2019
    hiroki@zrouter:/usr/home/hiroki/zobj/usr/home/hiroki/ZRouter/tmp/usr/home/hi
roki/freebsd/arm.armv7/sys/Pcduino_Lite arm
FreeBSD clang version 8.0.0 (tags/RELEASE_800/final 356365) (based on LLVM 8.0.0
)
CPU: ARM Cortex-A8 r3p2 (ECO: 0x00000000)
CPU Features: 
  Thumb2, Security, VMSAv7
Optional instructions: 
  UMULL, SMULL, SIMD(ext)
LoUU:2 LoC:3 LoUIS:1 
Cache level 1:
 32KB/64B 4-way data cache WT WB Read-Alloc
 32KB/64B 4-way instruction cache Read-Alloc
Cache level 2:
 256KB/64B 8-way unified cache WT WB Read-Alloc Write-Alloc
real memory  = 1073741824 (1024 MB)
avail memory = 1041166336 (992 MB)
Fatal kernel mode data abort: 'Alignment Fault' on read
trapframe: 0xc060ac28
FSR=00000001, FAR=c04c8b46, spsr=200000d3
r0 =c1c01c3c, r1 =c04c8b46, r2 =c110b891, r3 =00000000
r4 =0000003c, r5 =00000014, r6 =0000001c, r7 =ffffffe4
r8 =00000000, r9 =c04c8b2f, r10=c1c01c78, r11=c060acf0
r12=ffffffff, ssp=c060acb8, slr=c0462a80, pc =c0462ad4

panic: Fatal abort

이것은 예전에도 쓴 , LINUX_BOOT_ABI 커널 옵션으로 픽업 할 수있는 u-boot의 메모리 크기와 dts의 메모리 크기를 더하여 실제 크기의 두 배가되기 때문입니다.

rootfs는 gpart에서 슬라이스를 추가하고 거기에 ZRouter로 빌드 한 iso 이미지를 dd로 쓰고 mount하려고 시도했습니다. SD 카드의 내용은 이런 느낌입니다.



이것을 고쳐도 불안정하고, 여러가지 생각해 보아, 한 번 메모리 사이즈를 256M로 해 보았더니 안정되었으므로, 메모리 컨트롤러의 초기화 유래의 문제와 핀이라고 했습니다.

다른 보드의 u-boot를 사용하고 있었던 것이 문제로, u-boot를 pcDuino 용 빌드 하고 사용했는데 문제 없게 움직이게 되었습니다.

ZRouter의 rootfs를 넣으려면 다음과 같이 공간을 확보하십시오.
% sudo gpart add -s 1g -t '\!165' /dev/da0

SD의 FAT에 커널을 복사하고 u-boot로 아래의 설정을 하면 자동 기동이 됩니다. SD는 대부분 크기 때문에 압축하지 않도록했습니다.

아래 내용으로 boot.cmd를 만듭니다.
fatload mmc 0:1 0x41000000 Pcduino_Lite_kernel.kbin.uboot
bootm 0x41000000

ZRouter의 객체 디렉토리에서 uboot_mkimage 명령을 사용하여 boot.scr을 만들고 Pcduino_Lite_kernel.kbin.uboot와 함께 fat에 복사하면 기본값으로 부팅됩니다.
% ./ztools/uboot_mkimage -C none -A arm -T script -d boot.cmd boot.scr

boot.scr 만들지 않고 bootcmd를 직접 다시 쓰거나 saveenv해도 부팅 할 수 있습니다.
=> setenv bootcmd 'fatload mmc 0:1 0x41000000 Pcduino_Lite_kernel.kbin.uboot;bootm 0x41000000'
=> saveenv

나는 센고쿠 처분품을 구입했지만, 2019/4 현재 아키즈키에서도 플래시가있는 pcDuino가 특별 판매되고있는 것 같습니다.

ZRouter는 FDT_DTB_STATIC에서 커널에 dtb를 갖도록 빌드합니다. u-boot에도 들어가 있을 것입니다만, 건네는 방법을 잘 모릅니다.

FreeBSD에서는 HDMI를 사용할 수 없는 등 있습니다만, 여러가지 시험하고 싶은 사람에게는 좋을지도 모릅니다. 조금 만지면 움직이게 되는 것도 있으므로, 즐거워요.

좋은 웹페이지 즐겨찾기