YuYan’s Uboot 簡易筆記
uboot command example
U-Boot# mii info
PHY 0x01: OUI = 0x80017, Model = 0x09, Rev = 0x00, 100baseT, FDX
PHY 0x03: OUI = 0x80017, Model = 0x09, Rev = 0x00, 10baseT, HDX
U-Boot# mii dump 1 0
0. (3100) -- PHY control register --
(8000:0000) 0.15 = 0 reset
(4000:0000) 0.14 = 0 loopback
(2040:2000) 0. 6,13 = b01 speed selection = 100 Mbps
(1000:1000) 0.12 = 1 A/N enable
(0800:0000) 0.11 = 0 power-down
(0400:0000) 0.10 = 0 isolate
(0200:0000) 0. 9 = 0 restart A/N
(0100:0100) 0. 8 = 1 duplex = full
(0080:0000) 0. 7 = 0 collision test enable
(003f:0000) 0. 5- 0 = 0 (reserved)
U-Boot# mii dump 1 1
1. (786d) -- PHY status register --
(8000:0000) 1.15 = 0 100BASE-T4 able
(4000:4000) 1.14 = 1 100BASE-X full duplex able
(2000:2000) 1.13 = 1 100BASE-X half duplex able
(1000:1000) 1.12 = 1 10 Mbps full duplex able
(0800:0800) 1.11 = 1 10 Mbps half duplex able
(0400:0000) 1.10 = 0 100BASE-T2 full duplex able
(0200:0000) 1. 9 = 0 100BASE-T2 half duplex able
(0100:0000) 1. 8 = 0 extended status
(0080:0000) 1. 7 = 0 (reserved)
(0040:0040) 1. 6 = 1 MF preamble suppression
(0020:0020) 1. 5 = 1 A/N complete
(0010:0000) 1. 4 = 0 remote fault
(0008:0008) 1. 3 = 1 A/N able
(0004:0004) 1. 2 = 1 link status
(0002:0000) 1. 1 = 0 jabber detect
(0001:0001) 1. 0 = 1 extended capabilities
U-Boot# mii dump 1 3
3. (5c90) -- PHY ID 2 register --
(fc00:5c00) 3.15-10 = 23 OUI portion
(03f0:0090) 3. 9- 4 = 9 manufacturer part number
(000f:0000) 3. 3- 0 = 0 manufacturer rev. number
雜項
- 8P8C,也稱RJ45,是乙太網路使用雙絞線連接時常用的一種連接器插頭。
- 1 個 phy 配 1 個 RJ45,所以板子上有 2 個 RJ45,所以在 uboot 使用 mii info 要能夠找到 2 個 phy。
- phy 上面會有自己所謂的 ID ,稱做 phy id ,會用於 MDIO/MDC 配對時用
- QSGMII 是一種接線法,連接 4 個 phy,負責交換 data,最大 5G(4 個 phy 加起來)
- SGMII 是一種接憲法 搭配 1 個 phy, 負責交換 data,最大 1.25G
XXXXX_driver.c
build .ko 檔
// 這是一個標準的phy範例格式
static struct phy_driver dp83640_driver = {
.phy_id = DP83640_PHY_ID,
.phy_id_mask = 0xfffffff0,
.name = "NatSemi DP83640",
/* PHY_BASIC_FEATURES */
.probe = dp83640_probe,
.remove = dp83640_remove,
.soft_reset = dp83640_soft_reset,
.config_init = dp83640_config_init,
.ack_interrupt = dp83640_ack_interrupt,
.config_intr = dp83640_config_intr,
.ts_info = dp83640_ts_info,
.hwtstamp = dp83640_hwtstamp,
.rxtstamp = dp83640_rxtstamp,
.txtstamp = dp83640_txtstamp,
};
lua + C
- Lua 是一種輕量語言,它的官方版本只包括一個精簡的核心和最基本的庫。這使得 Lua 體積小、啟動速度快。它用 ANSI C 語言編寫並以原始碼形式開放,編譯後僅僅一百餘 K,可以很方便的嵌入別的程式裡。和許多「大而全」的語言不一樣,網路通訊、圖形介面等都沒有預設提供。但是 Lua 可以很容易地被擴充:由宿主語言(通常是 C 或 C++)提供這些功能,Lua 可以使用它們,就像是本來就內建的功能一樣。事實上,現在已經有很多成熟的擴充模組可供選用。
標題Re: [問題] 請問有在用 Lua 的大大們...
C 與 Lua 會結合,就是因為沒有十全十美的程式語言
C 的優點是執行效率高,缺點是寫起來麻煩又不安全(undefined behavior)
Lua 跑起來雖然慢,但寫起來簡單,開發速度快
我們要截長補短,所以並沒有一定要讓誰呼叫誰比較好的規則,而是看需求:
* 程式規格固定、需要高效率、或是要呼叫底層函式的部份用 C 寫
* 規格時常變動,需要快速做出來驗證效果的,用 Lua 來寫
* 想要更高的彈性,因此設計 plug-in 系統,更適合用 Lua
比如說你想做個爬網頁的程式,那麼開 socket 的部份自然得用 C 寫
但是網頁抓下來後你可能想做各式各樣的動作,像是存圖片、掃瞄關鍵字等等
這部份用 Lua 寫就可以很靈活的變化,這種情況是 Lua 呼叫 C
又比如說許多遊戲引擎使用 C++ 來實作運算吃重的核心
但是會在特定位置呼叫外部的 Lua script
這麼一來就可以用 Lua 快速實做出不同玩法的遊戲
等到玩法確定後,再把需要效能改善的部份用 C++ 重寫
如果全部都用 C++ 開發,那麼開發時程是會大幅拉長的
另一個 Lua 的優勢是它的 runtime 很小,只依賴 standard c library
只要環境能跑 C 就可以把 Lua runtime 編起來跑
在 C 程式中包進一個 Lua interpreter 比起 python / ruby 是簡單許多的
而且正因為 Lua standard library 功能非常陽春
當你想要設計 plug-in 系統時,會比較容易去禁止 plug-in 做壞事
反正它真需要什麼底層功能,你再給它對應的 library 即可
沒有人規定給 C 呼叫的 function 一定要跑得和 C 一樣快
選擇適當的工具去滿足開發需求,這才是程式設計師的專業所在
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.243.240
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1484745230.A.918.html
推 Neisseria: 感謝大大說明,現在比較有概念了 01/18 21:34
推 CoNsTaR: 對C來講,或許包給Lua做事的部分可以在函式名稱上有區別 01/19 03:54
→ CoNsTaR: 沒有人規定給C呼叫的函式一定要和C一樣快 01/19 03:54
→ CoNsTaR: 但是當你的系統裡面存在越來越多這種和表面上看起來有一 01/19 03:54
→ CoNsTaR: 點點不一樣的東西 01/19 03:54
→ CoNsTaR: 我想累積下來一定也不是什麼好事吧~ 01/19 03:54
→ hichcock: 這篇寫的很棒ㄚ~ 01/19 09:02
→ hichcock: 重點在於 C + Lua 可以把效能 + 彈性的效果最大化 01/19 09:17
推 shadow0326: 推 01/19 10:51
推 eye5002003: 補個優點,lua語法簡單,有機會開放讓非程式人員修改 01/22 22:46
→ alex70266: 重點是彈性阿,C call lua script 包 C module很常用