Linux

【Zynq7】番外編2.MACアドレスをQSPIFlashから読み出して設定する

1.記事一覧

記事は複数回に分けて投稿します。XilinxのARM SoC (Zynq7020SoC)で動作する、PetaLinuxを使わない素のLinuxをソースコードから構築します。

ZynqMP(arm64版)はこちら

エッジArm Linux構築編(armv7l)

エッジArm Linux実践編(armv7l)

2.GigabitEtherのMACアドレスが変わる問題

今までの構築方法では、起動時に毎度MACアドレスが変わってしまい、DHCP割当IPが毎回変わります。これではssh接続がやり辛いですし、ルータのDHCPリースも増えてしまいます。ということで対策をします。

Linuxを使用する場合、EtherのMACアドレスの設定タイミングは大きく分けて3回あります。

  • FSBL(1st Stage Boot Loader)実行時
  • u-boot(2nd Stage Boot Loader)実行時
  • Linux実行時

試しにUbuntuのnetplanでMACアドレスの固定値が記述できるのですが、上書きできるか試したところ、無視されました。またLinuxのデバイスツリーのgem{}でも固定値を記述できますが、これも無視されてしまいます。

混乱してきたので、固定値設定とROM読み出し設定とFSBL、u-boot、Linuxの設定について整理する必要がありそうです。ちょうどなひたふ氏のブログの記事が参考になりました。
http://nahitafu.cocolog-nifty.com/nahitafu/2018/01/zynq.html

以下、ブログ内容を一部加筆修正しています。

MACアドレスの採用される優先順位の高い順に並べると、
1.uEnv.txtの追加設定
2.zynq-common.hに書かれたethaddr
3.EEPROMの情報
4.U-Bootが生成する乱数
———– 越えられない壁 ——–(U-Bootがデバイスツリーを書き換えるから)
Linuxのデバイスツリーに書かれたプロパティ
5.mac-address
6.local-mac-address
7.address

http://nahitafu.cocolog-nifty.com/nahitafu/2018/01/zynq.html

わかりやすいですね、脱帽です。

FSBLでMACアドレスを設定してもu-bootが再設定してしまいます。u-bootでは設定が上記1.2.3.4の順で設定されます。

[1.uEnv.txt]
SDのFAT bootパーティションにuEnv.txtを配置して、独自の環境変数を定義して読み込ませることができます。しかし、今回使用したu-boot v2022.01で読み込ませる方法がわかりませんでした。

[2.zynq-common.h]
環境変数ethaddrをソースコードにハードコードしてMACアドレス固定値を書きます。すぐにできそうです。しかし、複数ボードで管理する場合、いちいちリビルドする必要があるのでデバッグ時に固定したい場合のときくらいしか使えそうにないです。

[3.EEPROM]
I2C接続のEEPROMからMACアドレスを読み取り設定する方法がwebで多く見つかりました。しかしzybo z7ボードには搭載されておらず、代わりにQuadSPI ROMが載っています。しかしQuadSPIROM読み出しに関するコードはざっと見ですが、見つかりませんでした。どうやら機能として未実装かもしれません。

[4.u-boot]
u-bootが乱数から生成するMACアドレスを設定。現在はこの状態です

[5-7.]
Linux上ではMACアドレス変更は不可との事のようです。netplanなどで変更できないのはデバイスドライバがprobeされたタイミングでしか書き換えられないからのようです。またLinuxデバイスツリーはu-bootのデバイスツリーEther情報が上書きされるとのことで、ここに設定しても無意味なようです。

u-bootのdefconfigでGigabitEther(“CONFIG_ZYNQ_GEM=y”)をそもそも無効にするとu-bootがMACアドレスを上書きしないため、FSBL以前の設定値がそのまま残るとのことです。今のところ、特にu-bootでEtherを使う予定はないので候補としてはありですね。

まとめると、MACアドレス設定の方法は2つの方法になりそうです。

  • MACアドレス固定値をソースコードに直書きする。簡単だが複数ボードで管理は困難
  • MACアドレスをROMから読み出して設定する。ただしQuadSPIROM読出しを実装する

前者は開発中に片手間にMACを設定したい場合は使えますね。後者は勉強として学ぶなら挑戦しておきたいところです。FSBLとu-bootのどちらで読出しを実装するかで更に分けて、難易度順に上から並べました。

  1. u-boot環境変数ethaddrをソースコードに直書きして固定値を設定する
  2. u-bootのEtherを無効化してFSBLで固定値を設定する
  3. u-bootのEtherを無効化してFSBLでQuadSPIROM読み出し処理を実装する
  4. u-bootのQSPI ROM読み出し処理を実装する

上から順に難易度が高くなっていきます。④は難し過ぎて工数が未知数です。
①はすぐできそうなのでやってみます。調べると③がいい塩梅の難易度でできそうな感じがしたので、u-bootで固定値を設定する方法とFSBLでQuadSPIROMを読み出す実装をそれぞれやってみます。

これからやること

  • u-boot環境変数ethaddrをソースコードに直書きして固定値を設定する
  • u-bootのEtherを無効化してFSBLでQuadSPI ROM読み出し処理を実装する

3.【対策1】u-bootで固定MACアドレスを設定する

目標

  • u-boot環境変数ethaddrをソースコードに直書きして固定値を設定する

u-bootのソースコードを改変し、直接環境変数を設定します。簡単ですが、複数のボードで管理となると難しいです。

u-bootのソースフォルダu-boot-xlnx/include/configs/zynq-common.hを開き、
“CONFIG_EXTRA_ENV_SETTINGS”マクロ定義を探して、ここに環境変数”ethaddr”を記述します。
MACアドレスはzybo z7ボードの場合HDMI_RX端子付近のバーコードラベルに書いてあります(値は例です)。

C
#ifndef CONFIG_EXTRA_ENV_SETTINGS
#define CONFIG_EXTRA_ENV_SETTINGS \
"scriptaddr=0x20000\0" \
"script_size_f=0x40000\0" \
"fdt_addr_r=0x1f00000\0" \
"pxefile_addr_r=0x2000000\0" \
"kernel_addr_r=0x2000000\0" \
"scriptaddr=0x3000000\0" \
"ramdisk_addr_r=0x3100000\0" \
BOOTENV \
"ethaddr=00:18:3e:00:00:00\0"      //<--ここに追加
#endif

後はmakeをやり直します。

Bash
$ make distclean
$ make clean
$ make myboard_defconfig #<--自分で作成したdefconfig
$ make

bootgenでboot.binを生成し直して完了です。
ip aコマンド確認すると私のボードのMACアドレスがきちんと反映されています。

Bash
zynq@zyboz7:~$ ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:18:3e:03:cc:e3 brd ff:ff:ff:ff:ff:ff    #<--正しく設定された
inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic eth0
valid_lft 3068853828sec preferred_lft 3068853828sec
inet6 fe80::218:3eff:fe03:cce3/64 scope link
valid_lft forever preferred_lft forever
3: sit0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
zynq@zyboz7:~$

4.【対策2】FSBLでQSPI ROMからMACアドレスを読出しを実装する

目標

  • FSBLでQuadSPI ROMから読み出しとMACアドレス設定処理を実装する

いよいよ本命です。やることはROMからデータを読み出してMACアドレスを設定するだけなのですが、道のりは決して楽ではないです。今回の実装の道のりをまとめました。

  1. 情報収集時短のため、似たコードやサンプルコードを探す
  2. ↑から必要なZynqのドライバ、ライブラリのドキュメントを集める
  3. ボード、ROM・Zynqデータシートのエクストリーム読書
  4. Zynqのドライバ、ライブラリドキュメントのエクストリーム読書
  5. 開発環境の準備
  6. コーディング
  7. デバッグ(JTAG)
  8. Linuxブート確認

4-1. 情報収集時短のため、似たコードやサンプルコードを探す

結論を言うと同条件で参考になりそうなコードはWeb上で見つけられませんでした。
しかし、似た条件の情報を2つ見つけました。

1つ目は実は以前から認知していました。内容を把握した上でu-bootでQuadSPI ROMからMACアドレスを読み出す改造は自分には困難であると判断しました。理由はこの記事のu-bootバージョンがv2017.11で今回使用しているのはv2022.01と新しいからです。変更する箇所のコードが改変されて解析が苦労しそうでした。u-bootの内部処理の情報はソースコード以外にほぼ無い認識のため、見通しが全く立ちませんでした。ただし、QuadSPIやMACアドレス設定処理フローのイメージが初めて掴めたので、先人には感謝ですね。

2つ目はFSBLでI2C EEPROM からMACアドレスを読み出して設定する方法のQAで、サンプルコードを開示されている神回答者の方がいました。MACアドレス設定の処理はほぼそのまま使えます。I2Cの処理を見て、QuadSPI版のドライバAPIのドキュメントをすぐにWebで探すことができました。

4-2. 4-1.から必要なZynqのドライバ、ライブラリのドキュメントを集める

Zynqの場合、QuadSPIは”PS部の周辺機能のQuadSPI”と、PL(FPGA)部にIPとして載せる”AXI QuadSPI”の2つがあることに注意しますベアメタルドライバが別になります。また、Linux版ドライバAPIの情報もあるので最初は混乱しました(全部英語なので)。
今回使用するのは”PS部の周辺機能のQuadSPI”側(Qspips Standalone driver)になります。ベアメタル=Standaloneとここでは呼ぶようです。

また、GigabitEtherも同様で”PS部の周辺機能のEthernet”とPL(FPGA)部にIPとして載せる”AXI-Ethernet”・”AXI-Ethernet Lite”の3つがあります。Linuxドライバも別にあります。
今回使用するのは”PS部の周辺機能のEthernet”側(Standalone Ethernet Driver)になります。

続いてROMデバイスに関しての情報を集めます。今回使用しているZybo z7ボードのリファレンスを見るとわかるのですが、ボードのPCB Revisionによって、搭載されているROMデバイスの型番が異なります。私の所有しているボードはZybo z7-20 RevBです。基板の裏のシルク印刷にRevが書いてあります。
RevBはSpansion製のQuad SPI Flash S25FL128Sが搭載されています。
RevD.0以降はWinbond製のW25Q128JV[S|P]xMになります。

余談ですが、Spansion社はCypress社に買収され、さらにinfineon社に買収されました。Flashのデータシートは現在infineonロゴとなっています(Cypressロゴ版もあります。差し替えめっちゃ工数かかってそう)。

続いて、端子設定にZynqとFlash間の配線情報が必要になります。ボードのRevが合った回路図を用意します。

最後に今回私がSPI Flashメモリを使うのが初めてのため、データシートを読む前にざっくりと使い方を学べる情報を探します。”SPI flash arduino”で検索すると良さげなページが見つかりました。
LogiClover開発ブログ様:SPI Flashの使い方

今回使用するFlashはNOR Flash型です。読出し/書込み/消去が1Byte単位で可能なEEPROMと違い、ページ単位(256~512Byte)書込み、セクタ単位(4KByte)の消去というEEPROMに無い概念があったり、SPIモードとDual/QuadSPIモードの切替えのやり取りはどうするのかなどのわからない点を整理しつつ、進めます。

最後に今までの参考情報をまとめました。

参考web1@ikwzm様のQiita:ZYBO用U-Boot で MAC アドレスを SPI ROM から読む
参考web2Digilent forum:How to obtain the MAC address of Zybo
参考web3なひたふJTAG日記:
ZYNQ LinuxのGigabitEtherのMACアドレスはどのように設定されるのか(前編)
参考web4LogiClover開発ブログ:SPI Flashの使い方
Zynq 7000 SoC
仕様書
Zynq-7000 SoC Technical Reference Manual
UG585 (v1.13) April 2, 2021
QuadSPI
driverAPI
standalone(ベアメタル)PSドライバライブラリ
Xilinx Wiki: Qspips Standalone driver
ドライバAPIソース:Github
Ethernet
driverAPI
standalone(ベアメタル)PSドライバライブラリ
Xilinx Wiki:Standalone Ethernet Driver
ドライバAPIソース:Github
ボード仕様書zybo z7 Reference Manual
QuadSPI Flash
仕様書
Spansion社(現infineon社) S25FL128S data sheet
ボード回路図zybo z7 Rev B.2

4-3. ボード、ROM、Zynqデータシートのエクストリーム読書

ボード回路図を読む

私の所有するRevBのzyboz7ボードでは
Spansion(現infineon)社製Quad SPI Flash S25FL128S (16MB)
が搭載されています。ボードのチップ刻印(写真)も確認します。

ボード仕様書の”4 Quad-SPI Flash”の章では、ボードのPCB RevisionでQuadSPIFlashのベンダが変更されていることがわかります。PCB Rev D.0以降はWinbond社製のデバイスになっていますが、一部の機能において互換性を持っていないことが書かれています。

MACアドレスが格納されている領域がOTP領域とセキュリティ領域と別の場所のため、今回の実装範囲でデバイスの互換性はありません。Flash内部レジスタから読み出せるManufacturer & Device IDで判別できるとのことなので、IDを読出し、Flashデバイスの種類を判別してからMACアドレスを読み出すようにします

QuadSPI Flashのデータシートを読む

アドレス空間が3つあります。

  • Flash memory array (4KB*32 and 64KB*254 ハイブリッドセクタ) ←未使用
  • ID-CFI address space (device ID and Common Flash Interface) ←Manufacturer & Device ID
  • OTP address space (One Time Program) ←MACアドレス

各アドレス空間にアクセスするためのコマンドがあり、切り替え操作は必要無いようです。また、特に初期化処理もデフォルトで良さそうなので省けそうです。

各コマンド仕様を見ていきます。まずはFlashのIDを読み出すコマンドです。

・ ID-CFI 読出し(Read Identification :RDID 9Fh)

<引用 infeneon 128 Mb (16 MB)/256 Mb (32 MB) FL-S Flash Datasheet>

コマンド0x9Fを1byte送信すると受信データ2Byte目から読み出されます。2~4byte目にManufacturer & Device IDが入るようです。Quad転送ではなく普通の(Single)SPI転送を行う必要があるようです。

転送サイズを決める前に、5byte目以降も情報を読み出せるので、ID-CFI アドレス空間マップを確認します。

長いので最初のみ抜粋しています。アドレス0x00-0x02の情報があれば十分そうです。

  • ManufacturerID: 0x01 Infineon(Spansion)
  • DeviceID: 0x2018 (128Mbit=16MB)

したがって、転送サイズは4byteです。

続いてMACアドレスが格納されている、OTP領域読出しコマンドです。

・OTP読出し(OTP Read : OTPR 4Bh)

コマンド0x4B+OTP24bitアドレス+ダミー1byteの計5byte送信すると、受信バッファ6Byte目から読み出されます。こちらもQuadではなく(Single)SPI転送です。MACアドレスは6byte長なので、転送サイズは11byte以上になります。

MACアドレスが格納されているOTP先頭アドレスはボード仕様より0x000020にあります。

Zynq PSのQSPI IPの仕様を読む

“Zynq 7000 SoC仕様書”のようなSoCやマイコンの仕様書は膨大なページ数があるので、私の場合は先にドライバライブラリのコードを読んでわからない部分を仕様書で探す方法を取ることが多いです。

今回私のようなSPIは使用した経験があるけどQuadは初めての人の視点で書いていきます。SPIの基本は省略します。ポイントとなる機能は2つです。

  • “APBバスI/Oモード転送とAXIバスリニアアドレスモード転送とレガシーSPI転送”
  • “Micron、Spansion製フラッシュメモリに対応したプログラム可能なバスプロトコル”

QuadSPIはFlashROMと高速な転送をするための通信規格のため、Flash利用に特化しています。今回はI/Oモード転送を使用します。”Micron、Spansion製フラッシュに対応”と仕様書にベンダ名を直接記載しているのが始めは違和感でしたが、どうやらFlashコマンドを自動で認識してSingleSPI、DualSPI、QuadSPIを切り替えるようです(え、なにそれすごい)。したがって、SingleやQuadに切替える処理は今回の場合不要です。

リニアアドレスモード転送とは物理アドレスにFlashのアドレスをマッピングして、物理アドレス上にROM領域があるかのように振る舞う機能です。物理アドレスにアクセスすると全自動でSPI転送してくれます。今回は使いませんので無視します。しかし、さすがFlashに特化しているなという印象です。そのうち使ってみたいです。

最後にまとめです。

ボードの注意点PCB Rev D.0以降はQuadSPI Flashの型番が異なる(Spansion -> Winbond)
QSPI FlashSpansion社製Quad SPI Flash S25FL128S (16MB) ただしボードRev B
QSPI処理の方針1.Flashの初期化処理はデフォルト値を使用するため不要
2.device IDを読み出して、型番を判別する。この後はSpansionのみ実装
3.OTPからMACアドレスを読み出す。
device ID読出しSPI転送モード:Single SPI (zynq PS QSPIは自動でSingle切り替え)
Flashコマンド:ID-CFI 読出し(Read Identification :RDID 9Fh)
転送サイズ:4byte
受信バッファ格納オフセット:2byte目より受信データ格納
読出しデータ1(期待値):ManufacturerID: 0x01 Infineon(Spansion)
読出しデータ2(期待値):DeviceID: 0x2018 (128Mbit=16MB)
MACアドレス
読出し
SPI転送モード:Single SPI (zynq PS QSPIは自動でSingle切り替え)
Flashコマンド:OTP読出し(OTP Read : OTPR 4Bh)
転送サイズ:11byte以上(実際は16byteにしてます)
受信バッファ格納オフセット:6byte目より受信データ格納
読出しデータ長:MACアドレス(6byte)

4-4. Zynqのドライバ、ライブラリのエクストリーム読書

使用するQuadSPI、Etherのベアメタルドライバライブラリの使い方を見ていきます。サンプルコードがあるので、そこまで困ることは無いです。

PS QuadSPIGithub:xqspips_flash_polled_example.c
PS GEtherGithub:xemacps_example_intr_dma.c

[PS QuadSPI]

割込みを使用しないポーリングタイプのブロッキングAPIを使用します。CPUのクロックサイクル時間に比べると、SPI転送は非常に時間がかかります。通常は転送終了割込みが発火するのを待ち、その間別の処理を行います。割込み発火後、次の処理を開始します。今回は急ぐこともなく、また複雑になるのを避けたいので、転送終了をループで待ち続けるポーリングタイプのブロッキングAPIを使用します。

ヘッダ#include “xqspips.h”
初期化関数1XQspiPs_LookupConfig(設定パラメータ読出し
初期化関数2XQspiPs_CfgInitialize()ドライバインスタンス生成
初期化関数3XQspiPs_SetOptions()オプション設定
初期化関数4XQspiPs_SetClkPrescaler()クロック分周設定
転送関数XQspiPs_PolledTransfer()転送(ポーリングによるブロッキング)

[PS Ether]

参考web2のコードをありがたく使わせていだいただきます。ただし、このコードが今もそのまま使えるとは限らないので、本家のドライバを確認します。

ヘッダ#include “xemacps.h”
初期化関数1XEmacPs_LookupConfig()設定パラメータ読出し
初期化関数2XEmacPs_CfgInitialize()ドライバインスタンス生成
MACアドレス設定XEmacPs_SetMacAddress()
MACアドレス読出しXEmacPs_GetMacAddress()読み出して正しいか確認する

4-5. 開発環境の準備

以前の記事の【Zynq7】1.FSBLの構築で作成したプロジェクトを改変していきます。

4-6. コーディング

実装したコードです。関係ないところは省略しています。
fsbl_hooks.c>FsblHookBeforeHandoff()関数に処理を追加します。このフック関数はu-bootに処理を移す直前に実行されます。

4-7. デバッグ(JTAG)

ベアメタルなので、JTAGデバッグが簡単にできます。ポインタ周りで躓いたときに、JTAGで一発でわかります。下図はSPI受信バッファの中身を見ています。

4-8. Linuxブート確認

起動確認の前に、u-bootの環境変数ethaddrの無効化と、GEM(GigabitEthernet)の無効化をします。

次に起動確認します。ブートログにログが出てEACアドレスが読み出されています。

Xilinx First Stage Boot Loader
Release 2022.2 Feb 22 2023-06:50:10
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x60600000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x000F6EC0
Data Word Len: 0x000F6EC0
Partition Word Len:0x000F6EC0
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD13B7E
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00006A30
PCAP DMA SRC ADDR 0xF8007018: 0x00100001
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x000F6EC0
PCAP DMA DEST LEN 0xF8007024: 0x000F6EC0
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100

DMA Done !

FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x0003A260
Data Word Len: 0x0003A260
Partition Word Len:0x0003A260
Load Addr: 0x04000000
Exec Addr: 0x04000000
Partition Start: 0x000FE490
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xF7E531DE
Application
Handoff Address: 0x04000000
In FsblHookBeforeHandoff function
Start connecting to QSPI Flash...    #<--ここから改良した部分の出力
QSPI Initialize...OK!
Searches for QSPI devices.
QSPI Flash was found. SPANSION S25FL128S 128Mbit(16MB)
Start reading MAC address from OTP area of QSPI Flash.
The MAC address read out is: 00 18 3E 03 CC E3
EtherMAC Initialize...OK!
Set the MAC address to EtherMAC...OK!
Read MAC Addr from EtherMAC: 00 18 3E 03 CC E3 =>Verify...OK!   #<--ここまで
SUCCESSFUL_HANDOFF
FSBL Status = 0x1

U-Boot 2022.01-dirty (Feb 18 2023 - 14:14:55 +0000)
CPU: Zynq 7z020
Silicon: v3.1
Model: Zybo z7 Custom Board by sh-goto
...

LinuxにログインしてMACアドレスを確認します。

zynq@zyboz7:~$ ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:18:3e:03:cc:e3 brd ff:ff:ff:ff:ff:ff      #<--MACアドレスが設定された
inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic eth0
valid_lft 3068702276sec preferred_lft 3068702276sec
inet6 fe80::218:3eff:fe03:cce3/64 scope link
valid_lft forever preferred_lft forever
3: sit0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
zynq@zyboz7:~$

無事設定されていました。マイコンのようなベアメタルプログラミングは久しぶりでした。手間はかかりますが、中々味があっていいですね。

ABOUT ME
sh-goto
組込エンジニア. 最近の遊びはLinuxの低レイヤいじりとXilinxのZynqとFPGAを使った電子工作