製品情報>Artix-7評価ボード>Artix-7開発日記

Artix-7開発日記

開発日記 2014年 (開発再び)

Artix-7 Linuxでネットワークを使うには

平成26年7月17日(木)

Artix-7 Linuxでネットワークを使うための注意点をまとめておきます。

まず、EDKでPortsの設定を出して、microblaze_0_intcを選択します。

A7lin_net1

ここでF2を押すと割り込みポートの設定画面が出ます。デフォルトではaxi_ethernetliteからの割り込みは入っていないので→ボタンを押して右側に移動します。

A7lin_net2

次に、Project→Export Hardware Design to SDKを行います。

これでHardwaer→Generate Netlistを行い、ISEに戻って、論理合成します。

BitStreamができあがったら、XILINX Design Tools→ISE Design Suite 14.5→Accesories→ISE Design Suite Command Promptを起動します。

A7lin_net4

data2memを使って、初段ブートローダのELFファイルをBitStreamに埋め込みます。

data2mem -bm edkBmmFile_bd.bmm -bd ..\withmmu\srecboot_withmmu\Debug\srecboot_withmmu.elf -bt main.bit

A7lin_net5

このbitファイルでFPGAを起動すれば、初期ブートローダ(srecboot)が起動して、SPI ROM内に格納されたU-Bootが起動します。

U-Bootが起動したら、下記のコマンドを入力することで、TFTPサーバからLinuxのカーネルイメージとRAMDISKとデバイスツリーを取得して起動します。

setenv ipaddr 192.168.1.99;setenv serverip 192.168.1.7;tftpboot b8000000 linux.bin.ub;tftpboot b4000000 uramdisk.image.gz;tftpboot b2000000 xilinx.dtb;fdt addr b2000000 00100000;fdt resize;bootm b8000000 b4000000 b2000000

A7lin_net6

Linuxが起動したら、

ifconfig eth0 up 192.168.1.99
route add default gw 192.168.1.1

でネットワークが使えるようになります。

A7lin_net7

これでPINGも飛ぶようになるし、もちろん、ネットワーク・ソケットプログラミングでサーバやクライアントを作ることもできるようになります。

どこかにTFTPサーバをたてておいて、XILINXのSDKで作ったELFファイルをTFTPでGETして実行すると、とても楽にMicroblaze Linuxのプログラム開発ができるようになります。

2014年7月16日

Artix-7 Microblaze Linuxでネットワークが使えない原因がわかりました。どうやら割り込みが問題だったようです。

今までXPSでMicroBlazeを生成するときにEtherLiteの割り込み出力をつないでいなかったのが原因でした。これをつなげばよいのですが、デバイスツリーに「割り込みの数は5個」と書かれているみたいで、単純に割り込みをつないだだけでは起動すらしなくなってしまいました。

本来ならばデバイスツリーを再生成しなければならないのですが、いろいろと大変だったので、使っていなさそうな割り込みを削ってEtherLiteからの割り込みをつないだところ、MicroBlaze LinuxからネットワークPHYを認識して、Pingまで飛ぶようになりました。

しかし60秒くらいでカーネルダンプして落ちてしまいます。次回はしっかりとデバイスツリーを作り直したいと思います。

2014年7月2日

再びArtix-7 Linuxを動かしています。

Artix-7 Linuxの使い方を思い出しました。忘れないようにまとめておきます。

  • FPGAのBitファイルは、C:\naitou\np1064\artix7-mb_20131011\withmmu\cpu_hw_platform\download.bit
  • このBitファイルの日付は、2013/10/16 21:16:44
  • 書き込むと、U-Bootまで起動する。
  • このBitファイルにはU-Bootのイメージまで入っている?

起動したら、U-Bootのコンソールで下記のコマンドを打つ。

setenv ipaddr 192.168.1.99
setenv serverip 192.168.1.7
tftpboot b8000000 naitou/linux.bin.ub
tftpboot b4000000 uramdisk.image.gz
tftpboot b2000000 naitou/xilinx.dtb
fdt addr b2000000 00100000
fdt resize
bootm b8000000 b4000000 b2000000

最初のipaddrは、Artix-7 MicroBlazeのIPアドレス。

serveripはTFTPサーバのアドレス。

MicroBlaze U-bootは、SPI ROMやSDカードからロードして実行ができないので、ネットワークブートにしたのだったと思う。

tftpbootで3回やっているのは、それぞれ、Linuxのカーネルイメージ、RAMDISK、デバイスツリーをロードしている。

linux.bin.ubはU-Bootヘッダが付いたlinux.binである。U-bootヘッダは64バイトで、どのアドレスにイメージをコピーするかという情報が入っている。linux.bin.ubは任意のアドレスにロードしてよいが、それがコピー先のアドレスと被ってはいけない。

上記のスクリプトでは、linux.bin.ubを0xb8000000にダウンロードして、実行するときにb0000000にロードするようになっている。

fdt addr b2000000 00100000とfdt resizeは、デバイスツリーをロードした後にやるおまじない。これをやらないとエラーが出て起動できない。

最後のbootmですべてを起動する。b8000000はlinux.bin.ubがロードされたアドレス。カーネルイメージが展開されるアドレス(0xb0000000)ではない。

起動時のメッセージは以下のようになる。

         #################################################################
         #################################################################
         1.1 MiB/s
done
Bytes transferred = 7318196 (6faab4 hex)
Using Xelite.40e00000 device
TFTP from server 192.168.1.7; our IP address is 192.168.1.99
Filename 'uramdisk.image.gz'.
Load address: 0xb4000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################
         1.1 MiB/s
done
Bytes transferred = 1497539 (16d9c3 hex)
Using Xelite.40e00000 device
TFTP from server 192.168.1.7; our IP address is 192.168.1.99
Filename 'naitou/xilinx.dtb'.
Load address: 0xb2000000
Loading: ##
         620.1 KiB/s
done
Bytes transferred = 7629 (1dcd hex)
## Booting kernel from Legacy Image at b8000000 ...
   Image Name:   Linux-3.9.0-dirty
   Image Type:   MicroBlaze Linux Kernel Image (uncompressed)
   Data Size:    7318132 Bytes = 7 MiB
   Load Address: b0000000
   Entry Point:  b0000000
   Verifying Checksum ... OK
## Loading init Ramdisk from Legacy Image at b4000000 ...
   Image Name:
   Image Type:   MicroBlaze Linux RAMDisk Image (gzip compressed)
   Data Size:    1497475 Bytes = 1.4 MiB
   Load Address: b4000000
   Entry Point:  b4000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at b2000000
   Booting using the fdt blob at 0xb2000000
   Loading Kernel Image ... OK
OK
## Loading init Ramdisk from Legacy Image at b4000000 ...
   Image Name:
   Image Type:   MicroBlaze Linux RAMDisk Image (gzip compressed)
   Data Size:    1497475 Bytes = 1.4 MiB
   Load Address: b4000000
   Entry Point:  b4000000
   Verifying Checksum ... OK
Early console on uartlite at 0x40600000
bootconsole [earlyser0] enabled
Ramdisk addr 0xb4000040,
FDT at 0xb2000000
Linux version 3.9.0-dirty (naitou@ubuntu) (gcc version 4.6.4 20120924 (prerelease) (crosstool-NG 1.15.3) ) #29 Thu Oct 17 00:12:36 JST 2013
setup_cpuinfo: initialising
setup_cpuinfo: No PVR support. Using static CPU info from FDT
wt_msr
setup_memory: max_mapnr: 0x10000
setup_memory: min_low_pfn: 0xb0000
setup_memory: max_low_pfn: 0xc0000
setup_memory: max_pfn: 0xc0000
Zone ranges:
  DMA      [mem 0xb0000000-0xbfffffff]
  Normal   empty
Movable zone start for each node
Early memory node ranges
  node   0: [mem 0xb0000000-0xbfffffff]
On node 0 totalpages: 65536
free_area_init_node: node 0, pgdat c0360374, node_mem_map c0800000
  DMA zone: 512 pages used for memmap
  DMA zone: 0 pages reserved
  DMA zone: 65536 pages, LIFO batch:15
early_printk_console remapping from 0x40600000 to 0xffffd000
pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
pcpu-alloc: [0] 0
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 65024
Kernel command line: console=ttyUL0,115200
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 250904k/262144k available (3344k kernel code, 11240k reserved, 115k data, 71k bss, 3686k init)
Kernel virtual memory layout:
  * 0xffffe000..0xfffff000  : fixmap
  * 0xffffd000..0xffffe000  : early ioremap
  * 0xf0000000..0xffffd000  : vmalloc & ioremap
NR_IRQS:33
interrupt-controller #0 at 0xf0000000, num_irq=5, edge=0x12
No chosen timer found, using default
timer #0 at 0xf0002000, irq=2
microblaze_timer_set_mode: shutdown
microblaze_timer_set_mode: periodic
Calibrating delay loop... 49.15 BogoMIPS (lpj=245760)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
device: 'platform': device_add
bus: 'platform': registered
bus: 'cpu': registered
device: 'cpu': device_add
device: 'cpu0': device_add
bus: 'cpu': add device cpu0
NET: Registered protocol family 16
device class 'bdi': registering
device class 'gpio': registering
device class 'tty': registering
bus: 'spi': registered
device class 'spi_master': registering
device: 'default': device_add
bio: create slab  at 0
device class 'block': registering
device: 'gpiochip248': device_add
XGpio: /axi@1/gpio@40000000: registered, base is 248
device class 'misc': registering
device class 'mdio_bus': registering
bus: 'mdio_bus': registered
bus: 'mdio_bus': add driver Generic PHY
bus: 'mmc': registered
device class 'mmc_host': registering
bus: 'sdio': registered
device class 'leds': registering
device class 'net': registering
device: 'lo': device_add
Switching to clocksource microblaze_clocksource
device class 'mem': registering
microblaze_timer_set_mode: oneshot
device: 'mem': device_add
device: 'kmem': device_add
device: 'null': device_add
device: 'zero': device_add
device: 'full': device_add
device: 'random': device_add
device: 'urandom': device_add
device: 'kmsg': device_add
device: 'tty': device_add
device: 'console': device_add
device class 'firmware': registering
NET: Registered protocol family 2
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP: reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Unpacking initramfs...
Freeing initrd memory: 1464k freed
device: 'axi.0': device_add
bus: 'platform': add device axi.0
device: 'axi.1': device_add
bus: 'platform': add device axi.1
device: '40e00000.ethernet': device_add
bus: 'platform': add device 40e00000.ethernet
device: '40a00000.spi': device_add
bus: 'platform': add device 40a00000.spi
device: '40a40000.spi': device_add
bus: 'platform': add device 40a40000.spi
device: '41a00000.axi-timebase-wdt': device_add
bus: 'platform': add device 41a00000.axi-timebase-wdt
device: '41c00000.timer': device_add
bus: 'platform': add device 41c00000.timer
device: '41400000.serial': device_add
bus: 'platform': add device 41400000.serial
device: '40000000.gpio': device_add
bus: 'platform': add device 40000000.gpio
device: '41200000.interrupt-controller': device_add
bus: 'platform': add device 41200000.interrupt-controller
device: '40600000.serial': device_add
bus: 'platform': add device 40600000.serial
Skipping unavailable RESET gpio -2 (reset)
bus: 'clocksource': registered
device: 'clocksource': device_add
device: 'clocksource0': device_add
bus: 'clocksource': add device clocksource0
bus: 'platform': add driver alarmtimer
Registering platform device 'alarmtimer'. Parent at platform
device: 'alarmtimer': device_add
bus: 'platform': add device alarmtimer
bus: 'platform': driver_probe_device: matched device alarmtimer with driver alarmtimer
bus: 'platform': really_probe: probing driver alarmtimer with device alarmtimer
driver: 'alarmtimer': driver_bound: bound to device 'alarmtimer'
bus: 'platform': really_probe: bound device alarmtimer to driver alarmtimer
jffs2: version 2.2. (NAND) (SUMMARY)  c 2001-2006 Red Hat, Inc.
msgmni has been set to 492
device class 'bsg': registering
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
device: 'ptmx': device_add
Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
Registering platform device 'serial8250'. Parent at platform
device: 'serial8250': device_add
bus: 'platform': add device serial8250
device: 'ttyS0': device_add
device: 'ttyS1': device_add
device: 'ttyS2': device_add
device: 'ttyS3': device_add
bus: 'platform': add driver serial8250
bus: 'platform': driver_probe_device: matched device serial8250 with driver serial8250
bus: 'platform': really_probe: probing driver serial8250 with device serial8250
driver: 'serial8250': driver_bound: bound to device 'serial8250'
bus: 'platform': really_probe: bound device serial8250 to driver serial8250
bus: 'platform': add driver uartlite
bus: 'platform': driver_probe_device: matched device 41400000.serial with driver uartlite
bus: 'platform': really_probe: probing driver uartlite with device 41400000.serial
uartlite: probe of 41400000.serial rejects match -19
bus: 'platform': driver_probe_device: matched device 40600000.serial with driver uartlite
bus: 'platform': really_probe: probing driver uartlite with device 40600000.40600000.serial: ttyUL0 at MMIO 0x40600000 (irq = 5) is a uartlite
console [ttyUL0] enabled, bootconsole disabled
console [ttyUL0] enabled, bootconsole disabled
device: 'ttyUL0': device_add
driver: '40600000.serial': driver_bound: bound to device 'uartlite'
bus: 'platform': really_probe: bound device 40600000.serial to driver uartlite
bus: 'platform': add driver of_serial
device class 'mtd': registering
device: 'mtd-unmap': device_add
device: 'mtd-romap': device_add
device: 'mtd-rwmap': device_add
bus: 'platform': add driver physmap-flash
bus: 'platform': add driver of-flash
bonding: Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
device: 'bond0': device_add
device: 'dummy0': device_add
bus: 'mdio_bus': add driver SMSC LAN83C185
bus: 'mdio_bus': add driver SMSC LAN8187
bus: 'mdio_bus': add driver SMSC LAN8700
bus: 'mdio_bus': add driver SMSC LAN911x Internal PHY
bus: 'mdio_bus': add driver SMSC LAN8710/LAN8720
Registering platform device 'Fixed MDIO bus.0'. Parent at platform
device: 'Fixed MDIO bus.0': device_add
bus: 'platform': add device Fixed MDIO bus.0
device: 'fixed-0': device_add
libphy: Fixed MDIO Bus: probed
bus: 'platform': add driver mdio-gpio
bus: 'platform': add driver mdio-mux-gpio
bus: 'platform': add driver mdio-mux-mmioreg
bus: 'platform': add driver xilinx_emaclite
bus: 'platform': driver_probe_device: matched device 40e00000.ethernet with driver xilinx_emaclite
bus: 'platform': really_probe: probing driver xilinx_emaclite with device 40e00000.ethernet
xilinx_emaclite 40e00000.ethernet: Device Tree Probing
xilinx_emaclite 40e00000.ethernet: no IRQ found
driver: '40e00000.ethernet': driver_bound: bound to device 'xilinx_emaclite'
bus: 'platform': really_probe: bound device 40e00000.ethernet to driver xilinx_emaclite
bus: 'platform': add driver xilinx_axienet
bus: 'platform': add driver xilinx_lltemac
PPP generic driver version 2.4.2
device class 'ppp': registering
device: 'ppp': device_add
SLIP: version 0.8.4-NET3.019-NEWTTY (dynamic channels, max=256).
device class 'uio': registering
bus: 'platform': add driver uio_pdrv_genirq
bus: 'mmc': add driver mmcblk
bus: 'mmc': add driver mmc_test
bus: 'sdio': add driver sdio_uart
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
bus: 'spi': add driver mmc_spi
sdhci-pltfm: SDHCI platform and OF driver helper
bus: 'platform': add driver leds-gpio
TCP: cubic registered
NET: Registered protocol family 17
device: 'cpu_dma_latency': device_add
device: 'network_latency': device_add
device: 'network_throughput': device_add
Freeing unused kernel memory: 3688k freed
Starting rcS...
++ Mounting filesystem
++ Starting telnet daemon
rcS Complete
/bin/sh: can't access tty; job control turned off
/ #

 

ネットワークが使えないかと試したが、ifconfigとやっても何も出ない。

ifcondif eth0 192.168.1.99

とやってもダメ。

ipaddrと打つと、

/ #
/ # ipaddr
1: lo:  mtu 65536 qdisc noop state DOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: bond0:  mtu 1500 qdisc noop state DOWN
    link/ether 4e:c8:b1:53:3f:01 brd ff:ff:ff:ff:ff:ff
3: dummy0:  mtu 1500 qdisc noop state DOWN
    link/ether 1a:e1:10:f6:cd:9b brd ff:ff:ff:ff:ff:ff

と出た。bond0とかdummy0というのはよくわからないけど、ifconfigやってみると・・

/ # ifconfig bond0 192.168.1.99
/ #
/ # ifconfig
bond0     Link encap:Ethernet  HWaddr 4E:C8:B1:53:3F:01
          inet addr:192.168.1.99  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ #

何やらIPアドレスは付けられたけど、動作はしなかった。

 

気を取り直して再び、カーネルのビルドから挑戦。

export CROSS_COMPILE=microblaze-xilinx-linux-gnu-
source /opt/Xilinx/SDK/2013.2/settings32.sh
make ARCH=microblaze mmu_defconfig
make ARCH=microblaze menuconfig

でメニューコンフィグが開く。Device Driverの中からSMSCを有効にする。

make ARCH=microblaze UIMAGE_LOADADDR=0xb0000000 linux.bin

でコンパイルが行われる。

コンパイルが終了すると、arch/microblaze/boot/linux.bin.ubというU-Bootイメージが出来上がっているので、それをtftpのディレクトリにコピーする。

cp arch/microblaze/boot/linux.bin.ub ../tftpboot/

.ubのイメージは自動的に作られるのでmkimageはしなくてよい。

再びtftpbootでLinuxを起動してみると、

bonding: Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
device: 'bond0': device_add
device: 'dummy0': device_add
bus: 'mdio_bus': add driver SMSC LAN83C185
bus: 'mdio_bus': add driver SMSC LAN8187
bus: 'mdio_bus': add driver SMSC LAN8700
bus: 'mdio_bus': add driver SMSC LAN911x Internal PHY
bus: 'mdio_bus': add driver SMSC LAN8710/LAN8720
Registering platform device 'Fixed MDIO bus.0'. Parent at platform
device: 'Fixed MDIO bus.0': device_add
bus: 'platform': add device Fixed MDIO bus.0
device: 'fixed-0': device_add
libphy: Fixed MDIO Bus: probed
bus: 'platform': add driver mdio-gpio

なにやらLAN8720のドライバが追加されたようだ。しかし、まだLAN8720にはアクセスできなかった。デバイスツリーが足りないのかもしれない。

 


© 2017 TokushuDenshiKairo Inc. All rights reserved