hard-floatでコンパイル(buildroot + kernel)

前々回から Raspberry Pi 上で動くrootfsをbuildrootを使って作成していますが、今更ですが、コンパイラが soft-float版 になっているのに気がつきました。buildroot の raspberrypi_defconfig を信じきっていたのが徒となったのです。Raspberry Pi は hard-float に対応しているので、宝の持ち腐れになっては本末転倒です。なので、hard-float に対応したコンパイラを使って buildroot をコンパイルする事にしました。

と言っても、buildrootにはarmv6+vfp版のコンパイラは選択項目にありません。なのでクロスコンパイラを用意する必要があります。armv6+vfp版のgccは結構落ちていたりするのでそれを使うのも有りですが、どうせなら自分で作ってしまえと思いクロスコンパイラを作成するところから始めました。まぁ、これがドツボにはまる原因となったのですが。

PC-Linux環境(VMware等でも可)を持っているなら binutils,gcc,glibc,mpfr,gmp,mpc,isl,cloog のソースコードを取得してそれぞれをコンパイルしてやればできあがり……なのですが、それぞれのバージョンを合わせたりパッチをあてたりする必要があったりで大変なのです。そこで、今回は crosstool-NG というツールを使うことにしました。このツールをインストールするとメニューを選択することで目的のクロスコンパイラを作成することができるのです! サポートしていればですが。

まずは crosstool-NG 自体のコンパイルとインストールです。コンパイルに必要なパッケージはもっと少ないのですが、この後の作業の事も考えて一気にインストールしています。

$ sudo apt-get install flex bison automake libtool libncurses5-dev texinfo lzma gawk cvs patch g++ gperf subversion build-essential
$ mkdir ./tools
$ cd ./tools/
$ git clone git://crosstool-ng.org/crosstool-ng
$ cd crosstool-ng/
$ git checkout crosstool-ng-1.20.0
$ ./bootstrap
$ ./configure --prefix=/home/jujurou/tools/crosstool-ng-1.20.0
$ make
$ make install


毎度使うツールでもないのでインストール先をhome下にしました。使うときは指定先にパスを通します。作業用ディレクトリを作成してクロスコンパイラの作成です。

$ export PATH=/home/jujurou/tools/crosstool-ng-1.20.0/bin:$PATH
$ cd ../
$ mkdir gcc-rpi
$ cd ./gcc-rpi/
$ ct-ng menuconfig
$ ct-ng build


menuconfig では次の様に指定しました。
書いてない部分はデフォルトの値にしています。
Linux kernel version はこの後で作成するkernelのバージョンに近い物を選択しています。

Paths and misc options  --->
[*] Try features marked as EXPERIMENTAL
Prefix directory
${HOME}/tools/x-tools/${CT_TARGET}

Target options --->
Target Architecture
(X) arm
[*] Use the MMU
Endianness:
(X) Little endian
Bitness:
(X) 32-bit
Architecture level
armv6zk
Emit assembly for CPU
arm1176jzf-s
Tune for CPU
arm1176jzf-s
Use specific FPU
vfp
Floating point:
(X) hardware (FPU)
Default instruction set mode
(X) arm
[*] append 'hf' to the tuple (EXPERIMENTAL)

Toolchain options --->
Tuple's vendor string
rpi

Operating System --->
Target OS
(X) linux
Linux kernel version
(X) 3.12.24 (longterm)

Binary utilities --->
binutils version
(X) 2.24 (EXPERIMENTAL)

C-library --->
C library
(X) eglibc
eglibc version
(X) 2_18

C compiler --->
[*] Show Linaro versions
gcc version
(X) linaro-4.8-2014.01
[*] C++


ct-ng build を実行すると、各ソースコードを取得して来てコンパイルし、指定先にインストールまでしちゃいます。これにはチョッとビックリしました。私の環境では、/home/jujurou/tools/x-tools/arm-rpi-linux-gnueabihf 下にインストールされました。

念の為、浮動小数点演算を使用したプログラムをコンパイルして、逆アセンブルしてみたところ、vfp用の命令が入っていることを確認出来ました。

841c:       ed1b6b03        vldr    d6, [fp, #-12]
8420: ed9f7b12 vldr d7, [pc, #72] ; 8470
8424: ee267b07 vmul.f64 d7, d6, d7
8428: ed0b7b03 vstr d7, [fp, #-12]


これでarmv6+vfp用のクロスコンパイラの作成完了です。
実際にはこのコンパイラでコンパイルした物をraspbian上で実行して動作することを確認しています。実行時のログとかは取ってませんが…。


クロスコンパイラが準備できたということで、本命のbuildrootをコンパイルします。make menuconfig の選択項目以外は前々回の内容と同じです。

Target options  --->
Target Architecture
(X) ARM (little endian)
Target Architecture Variant
(X) arm1176jzf-s
Target ABI
(X) EABIhf
Floating point strategy
(X) VFPv2
ARM instruction set
(X) ARM

Build options --->
Download dir
$(TOPDIR)/../dl

Toolchain --->
Toolchain type
(X) External toolchain
Toolchain
(X) Custom toolchain
Toolchain origin
(X) Pre-installed toolchain
Toolchain path
/home/jujurou/tools/x-tools/arm-rpi-linux-gnueabihf
Toolchain prefix
arm-rpi-linux-gnueabihf
External toolchain kernel headers series
(X) 3.12.x
External toolchain C library
(X) glibc/eglibc
[*] Toolchain has C++ support?
[*] Enable MMU support
Target Optimizations
-pipe -mtune=arm1176jzf-s -march=armv6zk

System configuration --->
[*] Run a getty (login prompt) after boot
getty options --->
TTY port
ttyAMA0
Baudrate
(X) 115200
TERM environment variable
vt100

Kernel --->
[*] Linux Kernel
Kernel version
(X) Custom Git repository
URL of custom repository
git://github.com/raspberrypi/linux.git
Custom repository version
c256eb9968c8997dce47350d2075e42f1b3991d3
Defconfig name
bcmrpi_quick
Kernel binary format
(X) zImage

Target packages --->
Hardware handling --->
Firmware --->
[*] rpi-firmware
Firmware to boot
(X) default


この設定ではkernelのコンパイルとFirmwareの取得も行う事にしています。ここではまった事が2点あります。1つが hard-float専用コンパイラを使用したが故に発生した事で、もう1つは…buildrootのせいです。

これ、そのままmakeを行うと以下のエラーが出てしまいます。

arm-rpi-linux-gnueabihf-gcc: error: -mfloat-abi=soft and -mfloat-abi=hard may not be used together


これは「soft-floatなんて処理できないぜ」と言っているのです。ま~、コンパイラをmulti-lib対応してませんしね。そもそもsoft-floatを要求するのは誰だ! と思ったら、kernelでした。こいつは厄介で、multi-lib対応しないとダメかな……と思っていたら、何と ld-linux.so.3 というライブラリを用意すれば何とかなるらしいのです。

このあたりの情報を見ると、かなり強引ではありますが、hard-float版のライブラリ(ld-linux-armhf.so.3)へのシンボリックリンクを作成するといった荒技があるみたいです。

ln -s ./ld-linux-armhf.so.3 ./ld-linux.so.3


このようにしておいてmakeをすると程なくしてコンパイル完了となります。
それぞれのファイルをSDカードに入れて起動させると、無事に起動しました。あっ、出力先をttyAMA0に変更するのを忘れないようにしてください。

Uncompressing Linux... done, booting the kernel.
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 3.12.28-quick (jujurou@ubuntu) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG 1.20.0) ) #1 PREEMPT Sun Feb 15 09:15:49 JST 2015
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: BCM2708
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 104648
[ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=720 bcm2708_fb.fbheight=480 bcm2708.boardrev=0xf bcm2708.serial=0xb9e9487d smsc95xx.macaddr=B8:27:EB:E9:48:7D sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000 dwc_otg.fiq_fix_enable=1 sdhci-bcm2708.sync_after_dma=0 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootwait
[ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[ 0.000000] Memory: 411552K/421888K available (3923K kernel code, 195K rwdata, 1684K rodata, 135K init, 610K bss, 10336K reserved)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xda000000 - 0xff000000 ( 592 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xd9c00000 ( 412 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc0581fa4 (5608 kB)
[ 0.000000] .init : 0xc0582000 - 0xc05a3d38 ( 136 kB)
[ 0.000000] .data : 0xc05a4000 - 0xc05d4ca0 ( 196 kB)
[ 0.000000] .bss : 0xc05d4cac - 0xc066d6d8 ( 611 kB)
[ 0.000000] Preemptible hierarchical RCU implementation.
[ 0.000000] NR_IRQS:394
[ 0.000000] sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 4294967ms
[ 0.000000] Switching to timer-based delay loop
[ 0.000000] Console: colour dummy device 80x30
[ 0.000471] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=10000)
[ 0.000494] pid_max: default: 32768 minimum: 301
[ 0.000827] Mount-cache hash table entries: 512
[ 0.001564] CPU: Testing write buffer coherency: ok
[ 0.001955] Setting up static identity map for 0xc03daae0 - 0xc03dab3c
[ 0.003530] devtmpfs: initialized
[ 0.018901] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
[ 0.019504] regulator-dummy: no parameters
[ 0.019778] NET: Registered protocol family 16
[ 0.024680] DMA: preallocated 4096 KiB pool for atomic coherent allocations
[ 0.025026] cpuidle: using governor ladder
[ 0.025048] cpuidle: using governor menu
[ 0.025448] bcm2708.uart_clock = 0
[ 0.026770] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[ 0.026790] hw-breakpoint: maximum watchpoint size is 4 bytes.
[ 0.026805] mailbox: Broadcom VideoCore Mailbox driver
[ 0.026903] bcm2708_vcio: mailbox at f200b880
[ 0.026984] bcm_power: Broadcom power driver
[ 0.027003] bcm_power_open() -> 0
[ 0.027014] bcm_power_request(0, 8)
[ 0.527719] bcm_mailbox_read -> 00000080, 0
[ 0.527737] bcm_power_request -> 0
[ 0.527749] Serial: AMBA PL011 UART driver
[ 0.527905] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83, base_baud = 0) is a PL011 rev3
[ 0.847568] console [ttyAMA0] enabled
[ 0.872958] bio: create slab at 0
[ 0.878275] SCSI subsystem initialized
[ 0.882352] usbcore: registered new interface driver usbfs
[ 0.888042] usbcore: registered new interface driver hub
[ 0.893529] usbcore: registered new device driver usb
[ 0.898992] Advanced Linux Sound Architecture Driver Initialized.
[ 0.906136] Switched to clocksource stc
[ 0.910302] FS-Cache: Loaded
[ 0.913408] CacheFiles: Loaded
[ 0.928427] NET: Registered protocol family 2
[ 0.934149] TCP established hash table entries: 4096 (order: 3, 32768 bytes)
[ 0.941502] TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.948065] TCP: Hash tables configured (established 4096 bind 4096)
[ 0.954489] TCP: reno registered
[ 0.957766] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 0.963611] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.970230] NET: Registered protocol family 1
[ 0.975018] RPC: Registered named UNIX socket transport module.
[ 0.981031] RPC: Registered udp transport module.
[ 0.985732] RPC: Registered tcp transport module.
[ 0.990459] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 0.997600] bcm2708_dma: DMA manager at f2007000
[ 1.002302] bcm2708_gpio: bcm2708_gpio_probe c05b0150
[ 1.007719] vc-mem: phys_addr:0x00000000 mem_base=0x1ec00000 mem_size:0x20000000(512 MiB)
[ 1.018629] FS-Cache: Netfs 'nfs' registered for caching
[ 1.024332] NFS: Registering the id_resolver key type
[ 1.029600] Key type id_resolver registered
[ 1.033786] Key type id_legacy registered
[ 1.038185] msgmni has been set to 803
[ 1.043360] io scheduler noop registered
[ 1.047438] io scheduler deadline registered
[ 1.051734] io scheduler cfq registered (default)
[ 1.056860] BCM2708FB: allocated DMA memory 59540000
[ 1.061863] BCM2708FB: allocated DMA channel 0 @ f2007000
[ 1.072563] Console: switching to colour frame buffer device 90x30
[ 1.083115] bcm2708_rng_init=da41a000
[ 1.094895] brd: module loaded
[ 1.102348] loop: module loaded
[ 1.105749] vchiq: vchiq_init_state: slot_zero = 0xda004000, is_master = 0
[ 1.113797] usbcore: registered new interface driver ax88179_178a
[ 1.120269] usbcore: registered new interface driver smsc95xx
[ 1.126253] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[ 1.332359] Core Release: 2.80a
[ 1.335512] Setting default values for core params
[ 1.340404] Finished setting default values for core params
[ 1.546137] Using Buffer DMA mode
[ 1.549458] Periodic Transfer Interrupt Enhancement - disabled
[ 1.555278] Multiprocessor Interrupt Enhancement - disabled
[ 1.560867] OTG VER PARAM: 0, OTG VER FLAG: 0
[ 1.565223] Dedicated Tx FIFOs mode
[ 1.568965] WARN::dwc_otg_hcd_init:1042: FIQ DMA bounce buffers: virt = 0xda422000 dma = 0x5958c000 len=9024
[ 1.578846] FIQ FSM acceleration enabled for :
[ 1.578846] Non-periodic Split Transactions
[ 1.578846] Periodic Split Transactions
[ 1.578846] High-Speed Isochronous Endpoints
[ 1.595605] WARN::hcd_init:473: FIQ at 0xc02d1190
[ 1.600343] WARN::hcd_init:474: FIQ ASM at 0xc02d1468 length 36
[ 1.606298] WARN::hcd_init:500: MPHI regs_base at 0xda41c000
[ 1.611966] dwc_otg bcm2708_usb: DWC OTG Controller
[ 1.616917] dwc_otg bcm2708_usb: new USB bus registered, assigned bus number 1
[ 1.624190] dwc_otg bcm2708_usb: irq 32, io mem 0x00000000
[ 1.629736] Init: Port Power? op_state=1
[ 1.633654] Init: Power Port (0)
[ 1.637190] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.643980] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.651239] usb usb1: Product: DWC OTG Controller
[ 1.655942] usb usb1: Manufacturer: Linux 3.12.28-quick dwc_otg_hcd
[ 1.662233] usb usb1: SerialNumber: bcm2708_usb
[ 1.667715] hub 1-0:1.0: USB hub found
[ 1.671532] hub 1-0:1.0: 1 port detected
[ 1.676989] bcm2708 watchdog, heartbeat=10 sec (nowayout=0)
[ 1.682805] bcm2835-cpufreq: min=700000 max=700000 cur=700000
[ 1.688731] bcm2835-cpufreq: switching to governor powersave
[ 1.694393] bcm2835-cpufreq: switching to governor powersave
[ 1.700201] sdhci: Secure Digital Host Controller Interface driver
[ 1.706423] sdhci: Copyright(c) Pierre Ossman
[ 1.710956] mmc-bcm2835: Unable to initialise DMA channels. Falling back to PIO
[ 1.756191] Load BCM2835 MMC driver
[ 1.759909] sdhci-pltfm: SDHCI platform and OF driver helper
[ 1.765852] usbcore: registered new interface driver usbhid
[ 1.771725] usbhid: USB HID core driver
[ 1.783840] TCP: cubic registered
[ 1.787284] NET: Registered protocol family 17
[ 1.793960] Key type dns_resolver registered
[ 1.807001] regulator-dummy: incomplete constraints, leaving on
[ 1.818172] ALSA device list:
[ 1.821154] #0: bcm2835 ALSA
 1.824650] Waiting for root device /dev/mmcblk0p2...
[ 1.843418] mmc0: host does not support reading read-only switch. assuming write-enable.
[ 1.853720] mmc0: new high speed SDHC card at address 59b4
[ 1.859747] mmcblk0: mmc0:59b4 NCard 29.4 GiB
[ 1.865718] mmcblk0: p1 p2
[ 1.868791] Indeed it is in host mode hprt0 = 00021501
[ 1.938015] EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities
[ 1.947638] EXT4-fs (mmcblk0p2): couldn't mount as ext2 due to feature incompatibilities
[ 2.046253] usb 1-1: new high-speed USB device number 2 using dwc_otg
[ 2.052866] Indeed it is in host mode hprt0 = 00001101
[ 2.080440] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 2.096233] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 2.117555] devtmpfs: mounted
[ 2.120976] Freeing unused kernel memory: 132K (c0582000 - c05a3000)
[ 2.286712] usb 1-1: New USB device found, idVendor=0424, idProduct=9512
[ 2.293446] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.310705] hub 1-1:1.0: USB hub found
[ 2.314787] hub 1-1:1.0: 3 ports detected
[ 2.400570] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered
Starting logging: OK
Initializing random number generator... [ 2.596433] usb 1-1.1: new high-speed USB device number 3 using dwc_otg
done.
Starting network...
[ 2.726595] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[ 2.733485] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.744307] smsc95xx v1.0.4

Welcome to Buildroot
buildroot login: [ 2.810197] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:e9:48:7d

Welcome to Buildroot
buildroot login:


入っているライブラリを検索すると、こんな感じになりました。

# find / -name "*.so*"
/lib/libc-2.18.so
/lib/libm.so.6
/lib/libpthread-2.18.so
/lib/libresolv-2.18.so
/lib/libc.so.6
/lib/librt.so.1
/lib/libcrypt.so.1
/lib/libpthread.so.0
/lib/modules/3.12.28-quick/modules.softdep
/lib/libnss_files-2.18.so
/lib/libutil-2.18.so
/lib/libnss_dns-2.18.so
/lib/ld-linux-armhf.so.3
/lib/libnss_dns.so.2
/lib/libgcc_s.so.1
/lib/libm-2.18.so
/lib/libnsl.so.1
/lib/libnsl-2.18.so
/lib/ld-2.18.so
/lib/libcrypt-2.18.so
/lib/libdl-2.18.so
/lib/libresolv.so.2
/lib/librt-2.18.so
/lib/libdl.so.2
/lib/libutil.so.1
/lib/libnss_files.so.2
/usr/lib/libstdc++.so.6.0.19-gdb.py
/usr/lib/libstdc++.so.6.0.19
/usr/lib/libstdc++.so.6
/etc/ld.so.conf
/etc/ld.so.cache
/etc/ld.so.conf.d


ld-linux-armhf.so.3 の方が入っているのですね。これからはこれをベースにして構築して行きます。
スポンサーサイト

tag : RaspberryPi

tag : buildroot

tag : Linux

VMwareで CUI Linux の実行

今回は、VMwareをらしからぬ使い方をしている私の環境を書きます。
手っ取り早くいえば、TeraTermからSSHでログインしてWinSCPでファイルのアップ/ダウンロードをしているって事です。

私のメインマシンは Windows7 64bit ですが、色々と…特に組み込みLinux関連を触っているとLinuxマシンが必要となってきます。しかし、ノートPCしか持っていないのと、2台を起動して両者を行ったり来たりするのはいやだし、何といってもLinux側はたまにしか起動しないので専用PCを用意したりはしたくありません…今のところ。こういったわがままな要求につきあってくれるのが仮想PCソフトです。私はその中でも有名所のVMwareを使用しています。VMware Player は非営利目的であれば無償で使えます。なので、自作環境では無償版を使用しています。

Linuxを使用するといっても主にクロスコンパイル用で、コマンドラインで操作し、エディタはviを使います。つまり、GUIの機能をほとんど使ってないのです。こんな使用用途の場合、インストールするディストリビューションもCUIで十分。GUIにするとCPUパワーを使うのでもったいないのと、ディスク容量も半端無く膨れあがってしまいます。昔から使い慣れている環境はDebian系で、今は有名所のUbuntuを使用しています。UbuntuにもCUIのバージョンはあります。いわゆるサーバ用途のバージョンなんですがね。


■ VMware環境を構築する
VMwareのページから自分の環境に合った VMware Player をダウンロードしてインストールしてください。私のPCは Windows7 64bit版 なのでそれようのをインストールしています。

次に、Ubuntu の ISO イメージファイルを入手します。今現在の最新版は Ubuntu 14.10 ですが、あまり最新過ぎるとネット上で情報が少なかったりするので、Ubuntu 14.04.1 LTS をインストールします。64bit版でも32bit版でもどちらでもよいのですが、今後の作業内容を見越して 64bit版を選択しています。32bit版の方が有利な場合もあるのでVMwareはディスク容量さえ十分にあれば複数のバージョンをインストールできるので、両方いれるのも選択の一つです。

VMwareを起動し、「新しい仮想マシン」を選択すると iso ファイルを要求してきますので、ダウンロードしておいたファイルを選択します。Ubuntu 14.04.1は簡易インストール(VMwareが自動的にインストール作業をしてくれる)対応してくれているのでインストールが楽です。

vmware_ubuntu_server14_04_01.png

フルネーム、ユーザ名、パスワードを入力します。

vmware_ubuntu_server14_04_02.png

VMware上での管理名として仮想マシン名を入力し、インストール場所を選択します。

vmware_ubuntu_server14_04_03.png

ディスク容量の指定をします。デフォルトでは20GBですが、今後の用途を考え60GBを選択しています。大きい分には問題ないのですが、小さく指定してしまうとクロスコンパイル等でオブジェクトファイルが膨大になってディスク容量を食い潰されるというアッチョンブリケな現象に陥ったことが多々ありました。この場合は物理的なディスク容量に余裕があればパーティションの拡張をすれば解決するのですが、パーティション拡張ソフトを使う必要があるので厄介です。

vmware_ubuntu_server14_04_04.png

これらを選択したらインストールスタートです。後はインストールが完了するまでひたすら待ちます。

vmware_ubuntu_server14_04_05.png

インストール時に設定したユーザ名とパスワードを使用してログインします。キー配列が英語配列になっているので特殊文字を使用する場合は注意してください。その上で、以下のコマンドを入力してパッケージを最新にし、SSHを有効にします。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get ssh


これで私の使い方ではVMware上での作業は終了です。あっ、ifconfigでIPを調べておいてください。

この後どうするかというと、Windows上でTeraTerm経由でUbuntuに接続して作業を進めます。なんでこんな事をするかというと、CUI版のUbuntuではWindows上でコピーした内容をペイスト出来ないとか、画面出力された内容をコピーできないとか何かと融通が利かないのでUNIX系本来の使い方であるリモートログインで作業を行います。TeraTermだとそれなりにWindowsライクな使い方が出来ますしね。

TeraTermはCOMポート用に使ってたりしたので、インストール画面を取れていません。ほとんどデフォルトでインストールしたと思います。SSHさえチェックを入れておけば良いのです。Cygwinとかは……使いたい人はチェックを入れてください。

TeraTermを起動すると接続先を聞いてきますので、SSH, TCPポート:22を選択してホスト欄にVMware上で動いているUbuntuのIPを記入します。このIPはVMwareにインストールする度に変わるみたいです。逆にインストールしなおさなければ次回も同じIPになります(自分で設定する事もできますが…)。SSH認証画面になります。初めてログインする場合はホスト鍵のフィンガープリントの登録画面になるので、接続を選択しておいてください。SSH認証画面ではユーザ名とパスワード(Ubuntuで設定した物)を入力してOKボタンを押下するとログイン出来ます。

teraterm_01.png

teraterm_02.png

teraterm_03.png

これでCUI環境は確立されました。独立したマシンとして使用するならこのままの使用でも良いのですが、Windows上にファイルを持ってきたいとかその逆とかをする場合はVMwareでフォルダの共有設定をします。が、それが面倒な場合は奥の手を使います。いや、正攻法かな?

SSHを利用してファイルのやりとりをするWinSCPというソフトを使用します。使い勝手はFFFTPみたいな感じです……知らない人は……使ってみてください。

winscp_vmware_ssh.png

私の Linux on VMware 環境はこんな感じです。GUIを使うソフトを扱う場合はUbuntu desktop版もインストールしているのでそちらも使いますが、結構GUIでCPUパワーを取られてしまいます。

tag : Linux

tag : VMware

Raspberry Pi の環境構築(失敗談)

Raspberry Pi は2012年の年初に発売されて今年(2014年)はB+という改良版(?)が出てきている状況。今更感が否めないですが、オーディオプレーヤとして最小の構成を目指すべくkrenelのコンパイルと、rootfsの内容を最小構成から増やす方向での構築を試みてみました…が、失敗しました。得た事も多いので記録として残しておきます。


kernelのコンパイルは…多くの方がされているので、その追従です。rootfsの方は、今までSDカードイメージを書き込んでそこからいらない物を止めたり削除したりしていましたが、その逆で、最小構成の物を入れて必要な物を追加するようにします。具体的には、rootfsの方は Linaro にある nano を入れて、そこから apt-get で必要な物を取得して行きます。

何はともあれ、raspbianのSDカードイメージの内容を確認しておきます。これによって必要な物が見えてくると思います(この時点では過去の経験より U-Boot とDevice Tree が必要と思い込んでいました)。そこで、raspbian のSDカードイメージファイルをDLして Win32 Disk Imager でSDカードへ書き込みました。この状態で Raspberry Pi へ差し込んで電源を入れれば raspbian が起動するのですが、今回の目的はそこでは無いので、Raspberry Pi へは差し込まず、PC-Linuxマシンに差し込み、中身を確認しました(正確にはWindows上で動かしている VMware Player 上の Ubuntu で確認)。

$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sdb1 vfat 57288 9656 47632 17% /media/jujurou/boot
/dev/sdb2 ext4 7515692 2350248 4814820 33% /media/jujurou/5d18be51-3217-4679-9c72-a54e0fc53d6b

$ sudo ls -l /media/jujurou/boot/
total 9656
-rw-r--r-- 1 jujurou jujurou 17824 Jun 19 19:59 bootcode.bin
-rw-r--r-- 1 jujurou jujurou 120 Jun 20 06:51 cmdline.txt
-rw-r--r-- 1 jujurou jujurou 1180 Jun 20 06:51 config.txt
-rw-r--r-- 1 jujurou jujurou 2090 Jun 19 19:59 fixup_cd.dat
-rw-r--r-- 1 jujurou jujurou 5845 Jun 19 19:59 fixup.dat
-rw-r--r-- 1 jujurou jujurou 8822 Jun 19 19:59 fixup_x.dat
-rw-r--r-- 1 jujurou jujurou 137 Jun 20 10:33 issue.txt
-rw-r--r-- 1 jujurou jujurou 3192224 Jun 19 19:59 kernel.img
-rw-r--r-- 1 jujurou jujurou 18974 Sep 25 2013 LICENSE.oracle
-rw-r--r-- 1 jujurou jujurou 512792 Jun 19 19:59 start_cd.elf
-rw-r--r-- 1 jujurou jujurou 2557720 Jun 19 19:59 start.elf
-rw-r--r-- 1 jujurou jujurou 3500744 Jun 19 19:59 start_x.elf

$ uname -a
Linux raspberrypi 3.12.22+ #691 PREEMPT Wed Jun 18 18:29:58 BST 2014 armv6l GNU/Linux


SD-USB変換を使っているので、デバイスとしては sdb として見えています。SDカードの中身は2つのパーティションに区切られていて、第1パーティションが VFAT(FAT32) で 第2パーティションが EXT4 でフォーマットされていました。第1パーティションの中身は…ファイル名から内容が分かる物と分からない物とが半々です。このあたりは Raspberry Pi の QA 広場に "How does Raspberry Pi boot?" という内容で起動の順が書かれています。簡単に書くとこんな感じでしょうか。

1. Raspberry Piに電源が入った時はGPUが起動し ARM core はoff、SDRAM も disabled な状態
2. GPUが1段階目のブートローダーを起動。
   → このブートローダーはSoCのROMにある。
   → ブートローダーはSDカードを読み込んで2段階目のブートローダー(bootcode.bin)をL2キャッシュに読み込み実行する。
3. bootcode.bin はSDRAMを有効にし、3段階目のブートローダー(loader.bin)をSDカードからRAMへ読み込んで実行する。
4. loader.bin は GPU firmware(start.elf) を読み込む
5. start.elf は config.txt、cmdline.txt の内容を元に kernel.img を SDRAM のアドレス0x8000に置く。
6. start.elf は ARM core をリセットして kernel.img のある 0x8000 から実行を開始させる。

loader.bin は elfファイルの読み込みとその先頭にジャンプするような簡単なプログラムと思われるので、bootcode.bin に取り込まれた可能性ありです。

この内容を見て驚いたのが、最初に起動する部分がGPUだという点です。いきなり ARM core に行くのではなく、GPUから起動させるという構成。何故そうなっているかは分からないですが、そこは "そういう物だ" と割り切りましょう。何せ、GPUのプログラム部分(bootcode.bin, start.elf)は作れないのですから。

GPUの動きは のぶさん のblog (bobuhiro11's diary) に 「CPUがカーネルを走らせ始めた後もGPUのコードはアンロード されないということが分かりました. GPUは,VCOS (Video Core Operating System)と呼ばれる小さなOSを走らせ, カーネル側とmailboxというプロトコルや割り込みを通して,グラフィックの 操作を行います. 驚いたことにGPUはグラフィックだけでなくクロック制御やオーディオの制御 も行うようです.」 と書かれていました(情報元は "Level of Hackability of raspberry pi" の様だ)。何か、マルチコアちっくな感じです。

Linux の kernel は 3.12.22 が使われています。私の記憶では kernel 3.1 から Device Tree が必要で、".dtb" ファイルが必要だと思っていたのですが、ここでは出現して来ませんでした。Device Tree が必要な場合は kernel のコンパイル時に設定するみたいです(Device tree driven kernel for raspberry pi)。

これである程度 Raspberry Pi に必要な構造が分かってきました。


と、ここで突然ですが、Linuxの大まかな構成について私が知っている事…というか知ったかぶりになっている構造を書いておきます。

Linux…特に Raspberry PiBeagleBone Black, pcDuino, ODROID といった組み込み系Linuxを触りだしてから分かったことは、非常に大雑把に区分けすると、bootloader, Linux kernel + kernel driver, rootfs(ユーザ空間の物) という3つの部分に分ける事ができると言う事です。

「bootloader」は圧縮されている kernel image を解凍してRAM上に展開します(物によっては非圧縮であったり、RAMに展開せずにROM上で動かす事もあります)。この部分はハードウェアにかなり依存していて、kernel を動かすボード毎に異なります。

「Linux kernel + kernel driver」はOSの中核機能を実行するのと、ハードウェアに依存する部分を kernel driver という形で一挙に引き受けています。

「rootfs(ユーザ空間の物)」はアプリケーションです。ハードウェアに依存する部分は kernel と driver が引き受けてくれているので、rootfs 部分はハードウェアにほとんど依存しない形で形成されています。"ls", "cd" といったコマンドもこの部分に該当します。大抵、アーキテクチャが同じであればコンパイル済みのバイナリを使い回す事ができます。

つまり、大抵の場合、用意する必要があるのは bootloader, Linux kernel + kernel driver の2つの部分です。Raspberry Pi に関して言えば、前述した様に bootloader 部分はバイナリ公開なので "Linux kernel + kernel driver" を用意すれば良いことになります(ここでアーキテクチャの事をもっとまじめに考えていれば失敗に至らなかったのに…)。

PC-Linuxで kernel と ドライバ をクロスコンパイルします。
以下のコマンドでコンパイルしました。回線速度にもよりますが、git clone のところで2時間くらいかかりました。

$ sudo apt-get update
$ sudo apt-get install git build-essential
$ git clone https://github.com/raspberrypi/linux.git
$ git clone https://github.com/raspberrypi/tools.git
$ git clone https://github.com/raspberrypi/firmware.git
$ export CROSS_COMPILE=`pwd`/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
$ export ARCH=arm
$ cd ./linux/
$ make mrproper
$ make ARCH=arm bcmrpi_defconfig
$ make ARCH=arm
$ make ARCH=arm modules
$ mkdir ../modules
$ sudo make ARCH=arm INSTALL_MOD_PATH=`pwd`/../modules modules_install
$ sudo make ARCH=arm INSTALL_MOD_PATH=`pwd`/../modules firmware_install


rootfsの内容は Linaro の armhf版を取ってきて使用します。
そのまま使用すると、システム出力先の ttyAMA0 にログが出力されないので、少々手を加えています。

$ wget http://releases.linaro.org/14.07/ubuntu/trusty-images/nano/linaro-trusty-nano-20140727-680.tar.gz
$ tar jxvf linaro-trusty-nano-20140727-680.tar.gz
$ cd ./binary/
$ cp ./etc/init/tty1.conf ./etc/init/ttyAMA0.conf
$ vi ./etc/init/ttyAMA0.conf
$ cat ./etc/init/ttyAMA0.conf
# ttyAMA0 - getty
#
# This service maintains a getty on ttyAMA0 from the point the system is
# started until it is shut down again.

start on stopped rc RUNLEVEL=[2345] and (
not-container or
container CONTAINER=lxc or
container CONTAINER=lxc-libvirt)

stop on runlevel [!2345]

respawn
exec /sbin/getty -8 115200 ttyAMA0


後はこれらの内容をSDカードへ書き込みます。
今回は raspbian を書き込んだSDカードの内容にVFAT領域は上書きで、EXT4の領域は一端全て削除して書き込みを行いました。

$ sudo cp ./firmware/boot/* /media/jujurou/boot/
$ sudo cp ./linux/arch/arm/boot/Image /media/jujurou/boot/kernel.img
$ sudo rm -rf /media/jujurou/5d18be51-3217-4679-9c72-a54e0fc53d6b/*
$ cp -r ./binary/* /media/jujurou/5d18be51-3217-4679-9c72-a54e0fc53d6b/
$ cd ./modules/
$ sudo cp ./* /media/jujurou/5d18be51-3217-4679-9c72-a54e0fc53d6b/


これでSDカードの準備は出来ました。
SDカードを Raspberry Pi へセットし、電源ONします。
あっ、私は万が一を想定して Raspberry Pi の UART出力端子とPCを繋いで起動ログを取るようにしてから実行しました。

その結果が以下です。

[    0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.12.26+ (jujurou@ubuntu) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) ) #1 PREEMPT Sat Aug 9 18:03:44 JST 2014
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: BCM2708
[ 0.000000] cma: CMA: reserved 8 MiB at 1b800000
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 113792
[ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0xf bcm2708.serial=0xb9e9487d smsc95xx.macaddr=B8:27:EB:E9:48:7D sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
[ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)

 中略

[ 2.824167] EXT4-fs (mmcblk0p2): recovery complete
[ 2.830518] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 2.841306] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 2.860680] devtmpfs: mounted
[ 2.865847] Freeing unused kernel memory: 140K (c05b8000 - c05db000)
[ 2.903622] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[ 2.903622]
[ 2.917044] CPU: 0 PID: 1 Comm: init Not tainted 3.12.26+ #1
[ 2.924189] [] (unwind_backtrace+0x0/0xec) from [] (show_stack+0x10/0x14)
[ 2.935638] [] (show_stack+0x10/0x14) from [] (panic+0x94/0x1d8)
[ 2.946397] [] (panic+0x94/0x1d8) from [] (do_exit+0x880/0x970)
[ 2.957170] [] (do_exit+0x880/0x970) from [] (do_group_exit+0x40/0xdc)
[ 2.968641] [] (do_group_exit+0x40/0xdc) from [] (get_signal_to_deliver+0x180/0x634)
[ 2.981453] [] (get_signal_to_deliver+0x180/0x634) from [] (do_signal+0xd0/0x440)
[ 2.994159] [] (do_signal+0xd0/0x440) from [] (do_work_pending+0xa4/0xb4)
[ 3.006191] [] (do_work_pending+0xa4/0xb4) from [] (work_pending+0xc/0x20)


最後の方を見れば分かりますが、起動時にカーネルパニックを起こして停止してしまいました。不安要素が沢山あったので、パニックになる事は想定内でしたが、この原因を調べているうちに超重要な事をこの計画段階で忘却していたのが分かってきました。

その原因とは……
「rootfsのアーキテクチャが異なっている!」
でした("あそびばLinux", Debian wiki)。

いやはや、この原因に行き着いたときには愕然としましたね。簡単な事です。Linaro で公開されている armhf版の rootfs の内容は ARMv7用(いわゆるCortex-A/Rシリーズ用) で、Raspberry Pi の ARM core は ARMv6 なんです。ARMv6でもVFPv2を搭載していて、armhf(hard float) のコンパイル結果を使用できるのですが、所詮 ARMv6+VFPv2、ARMv7 アーキテクチャとは異なります。現実をたたきつけられ、しばらくボーっとしてしまいました。



色々と考えはしてみたものの、良い案が浮かびませんでした。
なので、あても無くググってググって……を繰り返している時、偶然にも minibian なる物の存在を知ったのです。SDカードイメージで公開されてます。そうです、ココまでやってきた事全てを無かったことにして、簡単にSDカードの内容を構築する事ができる方法が合ったのです。

この minibian ですが、raspbian をサーバ用途に絞った構成で、描画関連を取り除いてRAMの確保と起動の早さをUPさせているみたいです。最初からSSHサーバが起動しているところを見ると、自分の仕様(MPDサーバ専用機)にでは必要の無い物が多く含まれている可能性はありますが、raspbian から削除しただけの構成なので、apt-get で raspbian 側のバイナリを取ってくる事ができる点が良いです。自分でソースコードからコンパイルをして構築する手もありますが、構築が大変な上に update まで大変になるので、このあたりで妥協しようと思います。

※ Arch Linux とかにするのも手ですが、Debian系(主にUbuntu)に慣れているので、これはパスしてます。

tag : RaspberryPi

tag : Linux

TL-WR700N(故障品)で何処までできる? その1

FON2405Eのファーム書き換えで 有線-無線変換 に興味を持ち、他の物にも手を出してみようとして白羽の矢が立ったのが TL-WR700N です。

2c44a8905a.jpg

ヤフオクで無茶安いな~と思ったら、故障品として出品されている物でした。突然使えなくなったということなので、電気系統のトラブルかファームがいきなり消えたかかな? くらいの感覚で安さもあって入札しました。淡い期待を持って電源に指してみましたが、やはりウンともスンとも動きません。実験材料として購入したので、ケースを開けて診断することに。

ケースを開けるのに何気に苦労しました。何せ情報が少ない且つ中国語(?)なので、読めないのです。発売元の TP-LINK が中国の会社ですしね。開け方は、薄くて堅い物(私は精密ドライバを使いました)を上蓋の溝に入れて押し開けるです。コツはLEDのあたりにツメがあるのでそこから外す。ACコンセント側にもツメがありますが、この部分を最後にするといったところでしょうか。とにかく堅いです。

RIMG0589.jpg

RIMG0578.jpg RIMG0583.jpg

RIMG0584.jpg RIMG0582.jpg

使用されているチップは MIPS 24K をコアとしたSoC AR9331 です。SDRAMは A3S28D40(8Mx16) でした。こうゆう品でのおきまりはシリアルFlashだと思いますが、型番を見えなくされていて読み取れませんでした。ネット上で調べるとSpansion製のFlashを使っているとかの情報もありますが、自分のは他のベンダー製だと思われます。しかし、同じTL-WR700Nでも回路が何パターンか有るみたいですね。

それよりも驚愕だったのが、シリアルFlash(らしき物)の取り付けがこれぞ中華品質(!?)と言わんばかりの…。

RIMG0576.jpg

テスターで電源周りを確認すると、出力されていない事が分かり、更に追跡するとパルストランスの出力側から電圧が出ていない事が判明しました。電源制御ICは LNK625 を使っていて、それに対する電圧は出ているのですが、肝心の出力側に出ていない。トランスを取り出してインピーダンスを計測すると、出力側が何処かで短絡しているみたいでした。

RIMG0585.jpg

型番や仕様の分からないトランスというのは厄介で、これを代えるのを諦め、思い切って直流電源から電力を供給することにしました。それぞれのチップの許容電圧を見比べ、要所要所に配置された謎ICを降圧レギュレータと仮定して5Vを入力してみたところ、ビンゴだったようでLEDの点灯とWi-Fiの電波を観測出来ました。電源部以外は生きている様です。よかったです。

因みに、Wi-Fiの電波確認にはスマホの Wifi Analyzer を使っています。

wif_analyzer.jpg

基板裏面に "TP_OUT", "TP_IN" と書かれたいかにもって感じのパットが有ったので、接続先を追って AR9331 の仕様書と見比べると、シリアル入出力端子となっていました。

RIMG0588.jpg

オシロで確認すると何か出ていそうだったのでPCに繋いでTeraTermを起動した所、ログが出力されました。また、コマンド入力も出来ました。ただし、一般的なLinuxコマンドは無く、極限定されたコマンドのみ存在しています。"ls"って打ち込んで「そんなコマンドねーぞ!!」と言われた時は焦りました…。"help" もしくは "?" と入力するとコマンド一覧が出てきます。

RIMG0586.jpg




________ ________ __ __ ____ _ __ ___
|________|| ___ | | | | || \ | || | / /
| | | |___| | __ __ | | | || \| || |/ /
| | | _____| |__ __| | |___ | || |\ || \
|__| |__| |______||__||_| \____||__|\___\


Software Platform for MIPS
Creation date: Aug 24 2011, 18:58:10 (chenyunchuan@tp-link.net)
Copyright(C) 2001-2010 by TP-LINK TECHNOLOGIES CO., LTD.
CPU: AR9330: AP121 Board
CPU freq: 400 MHZ
SDRAM size: 8 MB
ipaddr:192.168.1.1
serverip:192.168.1.100
file:vxWorks.img


Attaching interface lo0... done
Rx clbufs 768 each of size 1756
eth_rx_netpool_init: allocated, pDmaBuf=0x80637910, buffend = 80782514
ATHRS26: resetting s26
ATHRS26: s26 reset done
eth_rx_netpool_init: done already!
Attached IPv4 interface to mirror unit 0
Press Ctrl+C to stop auto-boot...
0
auto-booting...
Uncompressing...done
Starting at 0x80001000...

Attaching interface lo0... done
Rx clbufs 768 each of size 1756
eth_rx_netpool_init: allocated, pDmaBuf=0x80e1f960, buffend = 80f6a564
ATHRS26: resetting s26
ATHRS26: s26 reset done
Arm the watchdog timer for the GMAC hang detect
eth_rx_netpool_init: done already!
Attached IPv4 interface to mirror unit 0
bDhcps = 2
AP_DhcpsDetectInit:create task DhcpDetect successfully
usrAppInitEx: 116: GPIO_OE = c00081d
usrAppInitEx: 117: CP0 CONFIG = 80208483
usrAppInitEx: 118: CP0 CONFIG1 = 9ee3519e

-->starting wireless...
APCFG task id 80c59bc0
sysWlanInit ...
Create WLAN event task tWLANEventTask
Create mem partion 0x80c3b380 for size 73728
Boostrap clock 25MHz
ar9300RadioAttach: Need analog access recipe!!
Restoring Cal data from Flash
ant_div_control1 = 0x9
ath_get_caps[4303] rx chainmask mismatch actual 1 sc_chainmak 0
ath_get_caps[4278] tx chainmask mismatch actual 1 sc_chainmak 0
Create OS_MESGQ Successfully at 0x80c103c0
osifp->queue_head = 0x80c106c0
ag7240MemInit: allocated, dmabuf=0x80b49a20, buffend = 80c02924
Entering Task Loop
Entering WLAN event Task Loop
-->wps is shutdown!
ERROR:wireless OR ACL disable
sending message 80b2aca0,24
TDDP: Now listening client request.
tddp is running.
wmosSemMCreate() pMud->mudDataSem:-2136170640



Software Platform for MIPS
Copyright(C) 2001-2010 by TP-LINK TECHNOLOGIES CO., LTD.
Creation date: Nov 28 2012, 11:22:09
# Starting WLAN !!!!
AP_STARTMODE=standard
AP_ENABLE=1
ATH_COUNTRYCODE=156
wlan_vap_create : enter. devhandle=0x803aed40, opmode=IEEE80211_M_HOSTAP, flags=0x1
wlan_vap_create : exit. devhandle=0x803aed40, opmode=IEEE80211_M_HOSTAP, flags=0x1.
osif_ioctl_create_vap: vap 0x80ffe970 vap->iv_unit 0
ieee80211_end_load: load done
ath0 end flag = 0x00028802
default
default
default
IEE80211-FREQ IOCTL vap 0x80ffe970 0,0,0
AP_CHMODE=11NGHT40PLUS

WLAN IOCTL AP_CHMODE=11NGHT40PLUS=11NGHT20=11NGHT40PLUS=1003
IEE80211-MODE IOCTL 1,11NGHT40PLUS,13
set mode 11,-2130709132,6
set mode retv 0

WLAN IOCTL AP_PRIMARY_CH=auto=1=auto=1002
IEE80211-FREQ IOCTL vap 0x80ffe970 0,0,11

WLAN IOCTL PUREG=0=0=0=1004
IEEE80211-SETPURGE IOCTL 0

WLAN IOCTL AP_HIDE_SSID=0=0=0=1005
IEEE80211-SETHIDESSIDIOCTL 0

WLAN IOCTL AP_ISOLATION=0=0=0=1034
IEE80211-setparam-nobridge 0

WLAN IOCTL AP_TX11NRATE==0=0=1041
set auto rate

WLAN IOCTL AP_11G_PROTECTION==0=0=1042

WLAN IOCTL AP_BEACON_INTERVAL=100=100=100=1043

WLAN IOCTL AP_FRAGMENT_THRESHOLD=2346=2346=2346=1044

WLAN IOCTL AP_RTS_THRESHOLD=2346=2347=2346=1046

WLAN IOCTL AP_DTIM_PERIOD=1=1=1=1045

WLAN IOCTL AP_WMM_ENABLE=1=1=1=1051

WLAN IOCTL AP_WMM_NOACK==0=0=1052
IOCTL set wmm noack 0

WLAN IOCTL AP_CYPHER_2==CCMP=CCMP=1000
Get EIOCGADDR

WLAN IOCTL AP_NO_EDGE_CH==0=0=1056

WLAN IOCTL AP_MCASTRATE==0=0=1018

WLAN IOCTL AP_MACFILTER_MODE==0=0=1038

WLAN IOCTL AP_MACFILTER_LIST====1000
Get EIOCGADDR

WLAN IOCTL AP_SHORT_GI=1=1=1=1055

WLAN IOCTL AP_DISABLECOEXT=1=0=1=1075

WLAN IOCTL AP_SSID=TP-LINK_6C578C=Hornet_test_xxxxxxx=TP-LINK_6C578C=1001
IEE80211-ESSID IOCTL 1,TP-LINK_6C578C,15
AP_CHMODE=11NGHT40PLUS
AP_CWMMODE=1
IEE80211-CWMMODE IOCTL 1
AP_AMPDU=0
AP_PURE_N=0
AP_TX_CHAINMASK=1
AP_RX_CHAINMASK=1
AP_SECMODE=None
WPS_ENABLE=0
Security Mode: None
IEE80211-setparam-authmode 1
AP_MACFILTER_MODE=0
ieee80211_open

wantypeDetectionDaemon() in Wantype.c
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
FIXME: ar9300GetMinCCAPwr
ar9300LoadNF: *** TIMEOUT while waiting for nf to load: AR_PHY_AGC_CONTROL=0x1d0d5a ***
ar9300LoadNF: *** TIMEOUT while waiting for nf to load: AR_PHY_AGC_CONTROL=0x1d0d5a ***

WLAN IOCTL AP_BASICRATES====1039

WLAN IOCTL AP_DEBUG=0==0=1062

WLAN IOCTL AP_TX_POWER====1073
Starting Hostapd
AP_SSID=TP-LINK_6C578C
AP_HOSTAPD_DEBUG=
AP_IPADDR=192.168.1.2
AP_SECMODE=None
WPS BSS init
WPS_ENABLE=0
AP_SECMODE=None
WPS OPEN BSS init
Adding ath0 in bridge ...
default
Set EIOCGMIB2
default


ブート時に「Press Ctrl+C to stop auto-boot...」と言って来ているので、Ctrl+C を押しながら電源を入れるとブートローダ部分と思われる所で処理が止まって "?" を入力するとコマンド一覧を見ることが出来ました。



________ ________ __ __ ____ _ __ ___
|________|| ___ | | | | || \ | || | / /
| | | |___| | __ __ | | | || \| || |/ /
| | | _____| |__ __| | |___ | || |\ || \
|__| |__| |______||__||_| \____||__|\___\


Software Platform for MIPS
Creation date: Aug 24 2011, 18:58:10 (chenyunchuan@tp-link.net)
Copyright(C) 2001-2010 by TP-LINK TECHNOLOGIES CO., LTD.
CPU: AR9330: AP121 Board
CPU freq: 400 MHZ
SDRAM size: 8 MB
ipaddr:192.168.1.1
serverip:192.168.1.100
file:vxWorks.img


Attaching interface lo0... done
Rx clbufs 768 each of size 1756
eth_rx_netpool_init: allocated, pDmaBuf=0x80637910, buffend = 80782514
ATHRS26: resetting s26
ATHRS26: s26 reset done
eth_rx_netpool_init: done already!
Attached IPv4 interface to mirror unit 0
Press Ctrl+C to stop auto-boot...
Stop auto-boot...
#
#
#
# ?
command description
-------------------------------
? print all commands
flash flash [read | write | erase | modify] offset dataAddr len
go start application at address 'addr':go [addr]
help print all commands
md memory display, limited 16KB:md start_addr len
mm memory modify:mm addr value
printenv print environment variables
reboot reboot the systerm
setenv [ipaddr | ipmask | serverip | file | delay]
tftp tftp [host] [get | put] [source] [destination] [-d]
update update [boot | vxWorks] [host] [image]
ping ping host
# printenv
magicNumber:0x424f4f54
bootDev:mirror
unitNum:0
ipaddr:192.168.1.1
ipmask:255.255.255.0
gateway:192.168.1.1
serverip:192.168.1.100
file:vxWorks.img
delay:1


"magicNumber" ってのが怪しいですが、何なのかは不明です。

元のOSには VxWorks が使われているみたいですが、Linuxを使用したOpenWrtも行けそうな雰囲気です。OpenWrtでは TL-WR800N 用のファームを書き込める的な事が書かれているので、挑戦してみようと思います。

tag : TL-WR700N

tag : Linux

FON2405Eをイーサネットコンバータ化(その2)

オリジナルのファームでは柔らか銀行のアクセスしか出来なかったので、誰でもアクセスできる様にして、かつ、イーサネットコンバータにしたいのと設定を自分で色々と触りたいのでカスタムファームを作ります。ファームはatc-500さんの所にあるのを書き込んでも良いのですが、Ralink AP SoC SDK v3.3.0.1 を入手したのでこれを自分の環境でコンパイルしてみたいと思います。

コンパイル方法はatc-500さんの所に詳しく書かれているので、そちらを参考にされるのが良いでしょう。ここでは私の環境(Ubuntu 12.04.4 32bit)でハマった事を記載しておきます。

■ Ubuntu 12.04.4 32bit版を使用
Rakink SDK にはコンパイル済みのコンパイラが用意されているのですが、32bit版で構築されているので、64bit版のUbuntuを使用する場合は別途 ia32-libs パッケージを入れる必要があります。それと、最新の14.04ではGCCのバージョンのせいなのか、コンパイルが通りませんでした。思い当たる所はあったのですが、環境構築にあまり時間を取られたくなかったので、古い版である12.04をインストールしました。VMwareはサッとOSを入れ替えられて便利ですね。

■ Ubuntuのシェルをdashからbashへ変更
Ubuntuの標準シェルはdashになってます。ほとんどのプログラムがbashで動く事を前提としてる部分があるので、環境構築で時間を取られたくないというのもあり、bashに変更しました。変更方法は以下のコマンドを実行して "dashを使いますか?" といった質問に "No" で答えれば bash へ変更されます。dash に戻すには同じコマンドで "Yes" を選択します。

$ sudo dpkg-reconfigure dash


■ rootユーザを有効にする
コンパイル時に一般ユーザ権限だと作成に失敗する事態が発生したので、最初からrootユーザになることにしました。rootを有効にするには以下のコマンドを実行します。ま~早い話、パスワードを設定するだけなんですがね。

$ sudo passwd root


■ パッケージのインストール
kernelとrootfsの内容をコンパイルして最終的にイメージファイルへ圧縮するので、それらに必要なパッケージをインストールします。GCCはSDKにコンパイル済みの物があるのでそちらを(半ば強制的に)使用します。

# apt-get install zlib1g-dev g++ libncurses5-dev libreadline6-dev


■ リンカオプションの修正
Ralink SDK の内容をそのまま使用すると、何故かリンカエラーになります。ググってみると同じ事で悩まれているケースがあり、そこへ解決策が書かれていました。#1870 の内容に修正方法が記載されています。ようは"-lz" オプションが不足しているのですね。昨今の真空管事情でおなじみとなったロシア語です。

@ -21,14 +21,14 @@ mksquashfs.o: mksquashfs.c squashfs_fs.h mksquashfs.h global.h sort.h \
${Sqlzma}/sqlzma.h ${Sqlzma}/sqmagic.h \
${LzmaAlone}/liblzma_r.a ${LzmaC}/libunlzma_r.a

-mksquashfs: LDLIBS += -lpthread -lunlzma_r -llzma_r -lstdc++
+mksquashfs: LDLIBS += -lpthread -lunlzma_r -llzma_r -lstdc++ -lz
mksquashfs: mksquashfs.o read_fs.o sort.o

unsquashfs.o: CFLAGS += -U_REENTRANT
unsquashfs.o: unsquashfs.c squashfs_fs.h read_fs.h global.h \
${Sqlzma}/sqlzma.h ${Sqlzma}/sqmagic.h ${LzmaC}/libunlzma.a

-unsquashfs: LDLIBS += -lunlzma
+unsquashfs: LDLIBS += -lunlzma -lz
unsquashfs: unsquashfs.o

clean:


■ lzmaの再コンパイル
手順では以下のコマンドを実行するだけの様に記載されていますが、実際にできあがったイメージファイルをSPI-Flashへ書き込んで起動するとlzmaからの展開に失敗します。厳密には展開前のファイルチェックの段階でエラーとなります。

手順の通り一度lzmaはコンパイルしているのですが、何故かlzmaの圧縮(最後の最後で圧縮が実施されます)でしくっているみたいです(Ralink SDKのマニュアルも下の手順でlzmaをインストールするように書かれています)。

# cd ./sdk3301/RT288x_SDK/toolchain/mksquash_lzma-3.2/
# make
# make install


この対処方法は、かなり不明ではありますが、以下の様にlzmaを直接コンパイル、インストールすると解決します。lzma-4.32.0beta5ディレクトリは上記のmakeをする課程で作られます。

# cd ./sdk3301/RT288x_SDK/toolchain/lzma-4.32.0beta5/
# ./configure
# make
# make install



kernel + rootfs のコンパイル時の注意点はこんな所でしょうか。




シリアルFlashへのファームウェア書き込み方法は 吸い出し用Linuxの起動 でU-Bootの選択部分で "3" を選んだ所を "2" を選択します。

U-Boot 1.1.3 (Jan  6 2010 - 07:10:30)

Board: Fonera
DRAM: 32 MB
relocate_code Pointer at: 81fac000
spi_wait_nsec: 3e
spi deice id: c2 20 15 c2 20 (2015c220)
find flash: mx25l1605d
raspi_read: from:41030000 len:1000
Using default environment


##### The CPU freq = 320 MHZ ####

SDRAM bus set to 16 bit
SDRAM size =32 Mbytes

Please choose the operation:
1: Boot system code via Flash (default).
2: Load system code then write to Flash via TFTP.
3: Entr boot command line interface.
reset pressed for 2 seconds

You selected 2

0



2: System Load Linux Kernel then write to Flash via TFTP.
Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)
Please Input new ones /or Ctrl-C to discard
Input device IP (10.10.10.200) ==:10.10.10.200
Input server IP (10.10.10.3) ==:10.10.10.3 ← TFTPサーバアドレス
Input Linux Kernel filename (fonita.img) ==:fonita.img ← 書き込むファイル名




無事書き込まれると、自動的に起動します。
このときのログを記録し忘れました…。

tag : FON2405E

tag : イーサネットコンバータ

tag : Linux

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux トランジスタ式ミニワッター TRminiWatterPart4 MPD OpenOCD イーサネットコンバータ FON2405E DAC buildroot FM3ペリフェラル BeagleBoneBlack FM3評価ボード library OpenGL mingw ODROID-U2 TL-WR700N Edison bitbake KiCad 計測 VMware シングル FM4 ミニワッター 6N6P プリアンプ 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter