2020年8月27日 星期四

連接 Q Seven 模組


今天來介紹本實驗室最新產品...不, 應該叫實驗品, 因為有些功能掛了XD
我們設計一張板子來承載 Q Seven 規格的子卡 (以下簡稱 Q7)
使得我們可以用低成本客製化使用高速應用處理器, 運行標準 Linux 作業系統, 可驅動影像及繪圖加速
由於是高速應用處理器, 週邊自然也是高速的, 板子設計不同於 MCU 級的板子
此為本實驗室第一張四層板, 全通孔設計, 線間距 > 6 mil, 是最便宜的製作工程


Q7 規格規範了一種模組板的設計樣板, 固定的長寬尺寸, 有零件高度限制, 接腳也有定義
板子尺寸為 7 x 7 公分, 使用 MxM 插槽, 原先用於筆電顯卡的規格, 板子面積算蠻大的
擠一點的話可以塞進 x86 處理器, 用 ARM 的話則可以塞入額外週邊, 依各廠家需求而定
把一顆晶片加上足夠開機的週邊做成模組板, 購買此產品的客戶只須設計好週邊即可
以 ARM 的 Q7 來說就是加上記憶體, 儲存空間 (eMMC 或是 spi flash), 電源管理相關電路
最難搞的電源時序 (power sequence) 和記憶體初始化由 Q7 模組供應商搞定
模組電源只有一組 5V 輸入, 沒有複雜多相供電, 用帶開關腳的電源晶片送電, 開電就可開機
就是插電!開機!畫面輕鬆點亮!XD (如果顯示的高速線路沒問題的話)

模組化設計有好有壞, 好處就是可向前相容, 減輕設計負擔, 維修較容易 (輕鬆瞎換XD)
壞處則是容易有設計糾紛 (互踢皮球, 認為問題在對方線路), 對於耐震需求設計可能不會過, 韌體盜版議題
生意型態也不固定, 有廠只做代工不單賣模組, 有的可賣模組也可代工
這次我用的模組來自研華科技 (2395), 他們屬於後者, 賣模組也幫代工, 多層級服務
代工軟硬體, 代審電路設計, 全套半套都有(?), 我只買模組沒買服務, 無套(??)XD
看接腳定義, 然後......賭!XD 賭贏叫賭神, 賭輸叫賭狗!
研華有做一張評估板 ROM-DB7501-SCA1E 給 Q7 測試用:

後面我稱這張為 RDK (參考設計), 建議買一張這東西, 用來驗證 Q7 有沒有被你玩炸掉XD
這 RDK 就只是驗證用, 沒給電路圖也沒法抄, 而且也沒必要抄, 因為這貨其實有問題
後面在開發心得裡會說明, 而且這貨我剛拿到時還不會用, 插上 12V 無法開機
後來拿電錶到處捅, 發現把上圖板子下方中間那個紅色跳帽換上去就能開了
這個使用手冊沒寫, 使用手冊的照片還是舊的沒有那個跳帽, 太靠杯了
另外 debug 線好像只能配 7421, 我第一次買 7420 不能接, 把線剪了接 PL2303 才能用
雖然它很靠杯而且蠻貴的要五千多, 可是真的不能沒有它, 比對時常常需要用

這項計畫有幾個困難點需要克服, 我逐一列舉, 然後說明我的方案
首先第一個會遇到的就是料品, Q7 用的 MxM 連接器

此為標準高度, 另有低高度版本:

這東西拍賣有!但是價格奇高, 我詢問到的報價一個 200 元, 其實還好, 畢竟我也不會做太多片
但貴的不是單價, 而是最低採購量為 45 個! 靠杯, 這樣就九張小朋友了, 比模組板單價貴兩倍可還行?
所以去對岸找, 深圳出貨, 只買一個也出貨!非常血汗XD 單價 12 元人民幣, 便宜了不少
現在兩岸關係差, 個人直購困難, 請找代理, 轉入集貨倉批次來台, 交期 2~4 周, 沒錯, 就是這麼久
因此這個專案執行時光料件就消耗數個月, 買回來測一下, 然後再決定下一步, 再進料...如此循環
不一定所有料件都這麼久, 主要是連接器, 而其他零件雖然拍賣有, 但那些都是對岸賣家, 天貓來的
這種料件不是一般 DIY 玩家會買的, 這種大多企業才會買, 因此難取得
露天的天貓賣家出貨是直出, 交期較短但仍要一週, 應該也是集貨只是累積週期較短
所以我的選料不是看零件廠商目錄, 而是看天貓目錄XD 找到後對規格書, 買一點進來拼湊一下
可以就用, 不行再換, 即使是台廠料仍然要繞一大圈從天貓拉進來, 因為電子廠是不出小單的
一次要麼一捲或一盤, 千顆為單位, 就算買得起買回來也不知道要放哪, 保存不當還會損壞
如果是電子廠的硬體人員就不用這麼麻煩, 一通電話樣品送到家, 還都是最新的XD
所以當公司清理 "垃圾" 時我就會去撿XD HW 同事:這堆可以丟, 也可以撿!XD
雖然天貓目錄料品很多, 但品質落差很大, 有的很新, 有的氧化嚴重, 用刀片刮腳焊接是常態
不過露天上的天貓賣家有的還不錯, 交期雖長, 接腳氧化, 但至少都是真的, 還沒買到假的
出錯貨也能換 (但換貨和出貨一樣都是一週!), 價錢比掏寶的貴一點, 自行評估價差和時間決定

設計這板子雖然不需要搞定複雜電源序列和記憶體問題, 總電源, 高速週邊仍然具有難度
雖然單一電源 5V 輸入, 週邊還是有其他電源, 還是有多組電源要處理, 一開始我先做了一片板子:

WT-20, 雙面板, 沒有版載電源, 先解決高速信號問題, 並確認這 Q7 是不是單一 5V 就可以驅動
電源用 RT7257D, 立錡科技 (6286) 設計, 2015 年被聯發科收購, 這是顆 1.2MHz 降壓晶片

先用洞洞板拼湊一下, 然後接上去看會不會動, 這貨可以 3A 輸出, 若 5V 就是 15W
對於 imx6 全系列應該都是可以承載的, 並且寬工作電壓, 輸入端可以 4.5-18V, 以我的應用來說
用這晶片就可以接受 2-4 節鋰電池或是 12V 變壓器, 選項多元
固定的 1.2MHz PWM 調節輸出, 這類 IC 有多種工作頻率, 這會影響其反應速度
對於這種應用處理器一般是快一點的好, 不過我問硬體同事, 他說慢的也能用, 加大電容就可以
這顆速度算中等的, 我看過 2MHz 的, 但天貓目錄上沒有, 所以選這顆慢一些但寬工作電壓的
選這顆還有個重要理由, 這顆 datasheet 裡面直接列舉幾種常用電壓配置, 不用自己算和測, 服務周到XD
這顆 IC 自帶 FET, 會發熱, 因此雖然是 SOP 封裝, IC 底部有接地盤, 焊接時必須使用熱風槍
因此用戶必須熟悉熱風槍操作, 不可以干壞晶片或是干壞板子, 請參考前篇 實作 BGA 植球焊接
接地盤等同錫球, 需使用 BGA 工法下去做, 設計時需依照功率配置接地銅箔, datasheet 裡有說明

除了散熱, 銅箔配置時我採星狀連接, 主要是洞洞板測試時發現輸入端和輸出端的接地似乎有電壓差
可能是高速 PWM 震盪導致, 這我沒有證據, 完全是賭XD 由於以前聽那些做音響的人提過星狀接地
這次就這樣搞, 但我只有聽過沒看過參考設計, 完全是自己想像, 以下是 WT-21 的板子第二層的圖:

右上是電源輸入的接地, 拆分四組 RT7257D, 然後合併到一點才進系統, 在合併點有留個接頭
示波器量測時地線就夾這裡, 看起來沒什麼問題, 各組電壓都正常
這樣做對不對我不知道, 但至少它沒有爆炸XD

我這張 Q7 界面有多組高速信號:HDMI 約 1GHz, LVDS 和 1000 網路約數百 MHz
480Mbps 的 USB 2.0, 3Gbps 的 SATA, 5Gbps 的 PCIe, 都是非常快的信號
就算是 SD 卡也可達 208 MHz (有條件的, 目前我插的卡並沒法跑這麼快)
設計時有許多注意事項, 我參考的準則是這本:

High-Speed Layout Guidelines for Signal Conditioners and USB Hubs

Google 上面這串字即可取得, 德州儀器的, 下圖紅框處為我的 WT-21 的 HDMI 部份 layout

照這準則 layout 不完全 OK, 但問題很奇怪, 這次遭遇的就是 HDMI 問題
其他比 HDMI 快的像是 SATA, 在 WT-20, WT-21 都正常
比 HDMI 慢的, 像是 LVDS, USB 也是兩片都正常, 就只有 HDMI
在安裝 imx6dp 和 imx6qp 的 Q7 板無法顯示, 但 imx6d 和 imx6dl 的 Q7 卻正常顯示
這可能和 SoC 有關, 而研華 RDK 則是正常顯示, 目前懷疑是走線長度問題, 後面心得區有其他實驗

這張板子有施做 ESD 防護, 但目前我沒驗, 有沒有用不知道
防護方式也是聽別人說的, 也沒看過參考設計, 憑感覺亂做, 用賭的XD
設計精神是護城河, 外殼假設包在連接器上, 即是 USB, HDMI, 網路...等接口上
這些金屬連接器的殼全部接在一起, 做在板子邊緣, 而系統接地也全接在一起
系統接地被連接器的殼接線包起來但分離, 兩者中間用高耐壓電容連接
系統接地就像護城河中的城堡, 護城河外面的土地則是連接器外殼, 電容則是城堡對外的橋樑
這些橋樑有單向也有雙向, 電容屬於雙向, 單向的則是 ESD 元件, 平常是斷路
當城堡內遭受雷擊時, ESD 元件會開通橋樑將衝擊轉接到護城河外面的土地, 能量放出後恢復斷路
WT-21 第一層和第二層圖:
外圈紅色即是城外土地, 中間紫色第二層接地是城內範圍, 這沒有施做全包圍, 因為下面太多線包不起來
ESD 驗證時使用靜電槍, 規範有固定的能量曲線, 驗證結果印象中有四等級
A:雷擊不影響功能 B:雷擊時影響功能,結束後功能恢復 C:雷擊時影響功能,重開機才恢復 D:雷擊即損壞
是的, 最差的 D 級, 靜電槍打的模擬雷擊是會損壞你的硬體的
這顆 SoC 的 Q7 板幾乎所有界面都是直接接上 SoC 接腳, 除了 USB 有 Hub 和網路有 phy
其他都是直通, 意思就是如果設計不良, 零件不良, 焊接不良, 任一條件滿足, 雷擊下去就是燒 SoC
研華這些 Q7 板最便宜的也要四千多, 說實話我實在不想驗XD
可是任何會讓人觸碰到的電路板正常都必須驗, 所以嘛...
我打算等所有實驗做完, 而且心情好的時候才驗XD (然後驗完心情就不好了XD)

軟體部份 OS 用的是 Linux, imx 系列軟體以前由 freescale 和自由軟體社群聯合規劃
freescale 再被 NXP 併購後仍然維持此生態, 目前方案是 yocto
軟體取得從官網一層一層點:
Home / Processors and Microcontrollers / Arm Processors / i.MX Applications Processors /
i.MX 6 Processors / i.MX6QP / Tools and Software / Tools and Software /
Embedded Linux for i.MX Applications Processors
然後在一個不起眼的角落有份 pdf 文件, 取得方式和編譯流程都在裡面

從首頁進 Software 簡直眼花撩亂一堆不相干的東西, 還要搜尋才有, 直接點往 imx6 處理器比較容易定位
以前這份文件是壓在 zip 檔裡的, 超難找, 目前我覺得最容易定位該檔的方式就是從首頁一層一層點
yocto 是一套編譯系統, 主要由 python 運行
用了 "奇怪的方法" 把 python 和 shell script 混合運行
編譯精神是每個套件有各自的編譯腳本 (bb檔), 腳本中引用模板進行編譯 (bbclass檔)
腳本中可以定義方法去取代或部份取代模板中的流程, 模板也可以引用修改別的模板
腳本和模板可依變數切換操作細節, 變數主要來自編譯目錄下的 local.conf
選定機型和 SoC 後被引用到的機型和 SoC 的 conf 會再疊加變數
這堆變數會被模板加入最後生成 shell script 進行套件編譯
套件包含在目標平台上 (例如 arm) 運行的, 以及在本地開發主機上 (例如 x86-64) 運行的
整個系統編譯時會編譯開發工具 (例如編譯器), 然後用編譯好的開發工具去編譯目標平台軟體
會產出大量的中間檔以及消耗大量的時間
我不會提供太多這軟體相關的細節, 只會留下概略流程, 原因是這東西一直在變, 現在寫一堆下來
估計三到五年就沒用了, 所以還請看 NXP 裡面提供的流程教學, 每次釋出都更新
這軟體需要即時下載, 本地主機也有一些套件需求, 也要下載, 但這些資料都不是永久存在的
以 ubuntu 來說, 就算安裝 LTS 版, 幾年後套件伺服器主機會關閉, 你就抓不到需要的套件
同樣的, yocto 腳本裡寫的軟體載點也是如此, 這都會導致編譯失敗, 而用新系統編譯幾乎保證編不過
假設用 ubuntu 12.04 編會過, 幾年後換成 ubuntu 18.04, 幾乎保證編不過
雖然軟體已自帶許多本地軟體, 但編譯時會依賴系統裡的標頭檔, 這些都是會更新的, 一更新就編不過
而且所有和這有關的都會失敗, 非常難修, 所以最好的方法是製作 VM, 把當前環境建一份 VM
未來更新系統後就用 VM 去編, 然後整包編過成功的 yocto 裡面腳本連同 download 目錄一起封存
這包檔案目前我用的版本是 19GB (以前版本只有 5GB...), 這樣就可以解決套件抓不到環境不符合的問題
研華官網放的那包這板子專用的 yocto 就是四年前的, 我是用庫存 VM 才編過
沒有庫存的用戶請直接放棄, 就是這麼靠杯XD
編譯有問題請去問 Google, 別問我XD 因為我也只會 Google
這裡有個網域在研華下的 wiki, 可以抓到比較新的軟體:
http://ess-wiki.advantech.com.tw/view/IoTGateway/BSP/Linux/iMX6/Yocto_LBV8_User_Guide
不過那裡面好像也不是最新的, 畢竟一直跟成本太高, 而且裡面東西很雜, 我沒有用那裡的
看了一下好像有提供編譯環境, 用的是 docker, 我沒試過, 有需要的用戶可以看看
我用 NXP 提供的, 然後研究一下研華舊版的 device tree, 然後把它搬到新版的 yocto

接著放出這板子的相關資料:

電路圖
device tree 和 EC 韌體

軟體部份目前只先改 device tree, 這檔案適用研華 ROM-7421-A1 這張 Q7 卡
EC 韌體則是 WT-18 改來的, 只有能開機和收發 uart 而已, 之後再補

電路圖裡 GNDPWR 即是連接器外殼, GND 則是系統內接地, 四組電源中三組是 5V, 一組 3.3V
三組 5V 若把 SW12 和 SW13 短路就可以用一組供全系統 5V, 這是偷料用XD
因為並非所有 Q7 板都需要這麼多電, 雙核板的耗電肯定比四核少, 還有應用情境
若不裝 SATA 或 LCD, 5V_SATA 根本不需要, 如果 USB 週邊只有鍵盤滑鼠隨身碟
那 5V_Peri 也可以偷料, 和 5V_Q7 共用即可, WT-20 開發測試時全程就只有一組 5V
測試時是沒問題, 看應用情境調整, 不過 5V_Peri 最好加上
因為研華的手冊有提到 CB_PWR_EN 這隻腳用來開關載板電源, 這隻最好拿去控制 5V_Peri
我是沒看到問題所以先沒裝, 這東西可能和電源時序有關
3.3V_MCU 總是一插電就啟動, 給 EC 控制整張板子電源, EC 在筆電上就是顆 MCU
我用 NUC131 替代, 把三組 5V 的開關都交給它, 由於目前只測試功能故韌體裡三組是恆開
電路圖裡有些線路沒有畫, 原因是測沒過, 先標記 Failed, 以後有修好再改上去
但這希望不大XD 因為是幾乎想不到辦法的才忍痛標記的, 能修的話早修了

軟體部份把新版的 yocto 抓下來 (目前是 3.0 版, NXP 2.1 版), 先選 imx6qpsabresd 這張板子

bitbake imx-image-full

完成後可以加這個做 SDK, 開發軟體更便利:
bitbake -c populate_sdk imx-image-full

編譯後找 kernel-source 目錄, 然後把我改的 device tree 覆蓋進去
再強制編譯一次 kernel

bitbake -f -c compile linux-imx

然後安裝, 做出 SD 開機卡, 看是要直接 dd 產出的 .sdcard 檔
或是自己分割然後解壓縮 rootfs 都行, 只要記得:不要去動 Q7 卡上的 u-boot
那裡面包含記憶體參數, 改動它很麻煩, 而且他們好像有啟用安全開機, 這我沒花時間研究
光把 kernel 調整上去就花了很多時間, 這能先不動的我不想動!
(7421 的 u-boot 夠新, 還可以載入新 kernel, 但是 7420 就可能得想辦法搬 u-boot)
由於只有改 device tree, 這台機器目前只有測可以開機, 硬體功能能用, 無法關機或重開機!
那裡要打通 EC, 目前我只有把對 EC 的 uart 剛弄通而已, 這個先不管
研華這張 Q7 板上有帶 MCU, 應該也是有 EC, 但我不知道怎麼和它溝通, 於是再加裝自己的 EC
最糟的情況下大不了不用它的 EC, 然後繞一圈讓我的 EC 去拉重開機腳和 5V_Q7 開關
一樣可以進行電源管理, 但可能沒法做休眠這種功能, 再研究看看

軟體裝好後我們可以開始進行驗證, 以下用 yocto 3.0 內建工具驗一下各週邊功能 首先 u-boot 開機參數:
1. 從 Q7 上的 mmc 開機:
setenv wt21_load fatload mmc 2:1 0x12000000 zImage\; fatload mmc 2:1 0x18000000 imx6qp-rom7421-a1.dtb
setenv wt21_bootarg printk.devkmsg=on console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24,bpp=32 video=mxcfb2:off video=mxcfb3:off
setenv wt21_boot run wt21_load\; setenv bootargs \${wt21_bootarg}\; bootz 0x12000000 - 0x18000000
setenv bootcmd run wt21_boot
裡面有研華的預設韌體, 用的是舊版 kernel, 可以作為功能測試, 我打算等全部完成才刷掉它

2. 從 Q7 的 Micro SD 卡槽開機, 以 LVDS 輸出:
setenv wt20_load fatload mmc 0:1 0x12000000 zImage\; fatload mmc 0:1 0x18000000 imx6qp-sabresd.dtb
setenv wt20_bootarg printk.devkmsg=on console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw video=mxcfb0:dev=ldb,LCD10IN,if=RGB24,bpp=32 video=mxcfb2:off video=mxcfb3:off
setenv wt20_boot run wt20_load\; setenv bootargs \${wt20_bootarg}\; bootz 0x12000000 - 0x18000000
setenv bootcmd run wt20_boot
目前我的開機參數是這個

2. 從 Q7 的 Micro SD 卡槽開機, 以 HDMI 輸出:
setenv wt20_load fatload mmc 0:1 0x12000000 zImage\; fatload mmc 0:1 0x18000000 imx6qp-sabresd.dtb
setenv wt20_bootarg console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 video=mxcfb2:off video=mxcfb3:off
setenv wt20_boot run wt20_load\; setenv bootargs \${wt20_bootarg}\; bootz 0x12000000 - 0x18000000
setenv bootcmd run wt20_boot
由於 imx6dp 無法用, 目前只留著紀錄, 未來若有移植 imx6q 的 Q7 就可以用

進入系統後輸入 root 登錄, 不用密碼, 然後測試週邊
測試 SATA, 把 Q7 mmc 的分割區複製到 SSD
sabresd:/run/media/sda1# dd if=/dev/mmcblk3p2 of=mmcblk3p2 bs=1M sta
490733568 bytes (491 MB, 468 MiB) copied, 43 s, 11.4 MB/srandom: crng init done
random: 7 urandom warning(s) missed due to ratelimiting
3841982464 bytes (3.8 GB, 3.6 GiB) copied, 198 s, 19.4 MB/s
3676+0 records in
3676+0 records out
3854565376 bytes (3.9 GB, 3.6 GiB) copied, 198.34 s, 19.4 MB/s
root@imx6qpsabresd:/run/media/sda1#


測試 Micro SD, 把 Q7 mmc 的分割區複製到 WT-21 上的 Micro SD 卡
root@imx6qpsabresd:/run/media# dd if=/dev/mmcblk3 of=mmcblk2p3/3 bs=4M status=progress
3846176768 bytes (3.8 GB, 3.6 GiB) copied, 389 s, 9.9 MB/s
922+0 records in
922+0 records out
3867148288 bytes (3.9 GB, 3.6 GiB) copied, 389.926 s, 9.9 MB/s
root@imx6qpsabresd:/run/media#

測試 OTG USB, 有一組 USB 是 imx6 SoC 直出的, 用 host mode 測試
root@imx6qpsabresd:/run/media/sda3# dd if=/dev/mmcblk3 of=3 bs=4M status=progress
3862953984 bytes (3.9 GB, 3.6 GiB) copied, 305 s, 12.7 MB/s
922+0 records in
922+0 records out
3867148288 bytes (3.9 GB, 3.6 GiB) copied, 318.139 s, 12.2 MB/s
root@imx6qpsabresd:/run/media/sda3#

其他 USB 是過 Hub 的 (插在最遠的 J7 上)
root@imx6qpsabresd:/run/media/sda3# dd if=/dev/mmcblk3 of=3 bs=4M status=progress
3867148288 bytes (3.9 GB, 3.6 GiB) copied, 300 s, 12.9 MB/s
922+0 records in
922+0 records out
3867148288 bytes (3.9 GB, 3.6 GiB) copied, 300.276 s, 12.9 MB/s
root@imx6qpsabresd:/run/media/sda3#

測試 CAN, 和 WT-18 對接
root@imx6qpsabresd:~# ifconfig can0 down
root@imx6qpsabresd:~# ip link set can0 up type can bitrate 250000
IPv6: ADDRCONF(NETDEV_UP): can0: link is not ready
IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready
root@imx6qpsabresd:~# ifconfig can0 up

這指令可以發 CAN 訊息:
root@imx6qpsabresd:~# cansend can0 100#1122334455667788

這指令可以收 CAN 訊息:
root@imx6qpsabresd:~# candump -ta can0,100:7ff
 (1588586600.113636)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586600.615170)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586601.116931)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586601.618490)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586602.120225)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586602.621809)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586603.123566)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586603.625060)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586604.126802)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586604.628343)  can0  100   [8]  00 01 02 03 04 05 06 07
 (1588586605.130030)  can0  100   [8]  00 01 02 03 04 05 06 07
root@imx6qpsabresd:~# ifconfig can0 down

播放影片 (簡易模式)
gst-launch-1.0 filesrc location=/run/media/mmcblk2p3/lucky-star.mp4 \
! video/quicktime ! aiurdemux ! queue !  vpudec ! imxv4l2sink \
overlay-height=480 overlay-width=800 overlay-left=100 overlay-top=50

硬解後直出, 耗電較少

播放影片 (GL 模式)
gst-launch-1.0 filesrc location=/run/media/mmcblk2p3/lucky-star.mp4 \
! video/quicktime ! aiurdemux ! queue !  vpudec ! imxvideoconvert_g2d \
! glimagesink render-rectangle='<0,0,800,480>'

硬解後經過 2D 繪圖加速轉換顏色後進 OpenGL, 耗電較多, 差到 1W


播放影片 (視窗模式)
gst-launch-1.0 filesrc location=/run/media/mmcblk2p3/lucky-star.mp4 \
! video/quicktime ! aiurdemux ! queue !  vpudec ! imxvideoconvert_g2d \
! waylandsink window-height=480 window-width=800
這個用 wayland 縮圖, 可能沒有串到硬體加速, 卡卡的, 但只有這模式可以移動視窗

網路只有 7420 能通, 限制在 100Mbps, 用 1Gbps 的線材只會偵測到線路接上但不通...囧
用 wget 抓資料到 /dev/null 可測得約 11.7 MB/s
7421 接上則是 100M 和 1G 都是只會偵測到線路, 但如果改用 7421 emmc 內的系統開機是通的
用 emmc 內系統可測得 34.9 MB/s, 雖然沒到 1G 但至少比 100M 多, 至少確定我線路是對的
至於 Linux 裡還有啥要修改就要再查...



以下為開發心得
這項計畫最早是想用 rpi compute module 的

材料都買了, 可是最後砍掉了, 主要原因是相機支援
rpi 雖然號稱全開放, 但是相機的關鍵連接部份, 相機轉接 DSP 這段是封閉源碼的
現在有沒有開放不清楚, 至少我在蒐集資料階段看到時是封閉的, 要做一些比較奇怪的事情會有困難
而 imx 系列這段是全暢通的, 所以嘗試做 imx 平台, 結果做下去才發現......
之所以全暢通是因為啥都沒有XD 就只有一個接收器, 收到資料後用戶要 DIY
行啊, 就 DIY 看看, 結果啥資料也沒收到, 不知道是線路有問題還是相容有問題
所以這項計畫雖然還是有產出, 但仍然算是翻車了, 相機接口搞不定

上圖印 WT-21 文字下方有兩個互相垂直擺放的軟排線接口, 那就是相機接口
從外部接相機模組進來, 然後轉換接口和轉換 i2c 電壓後換成研華 Q7 的相機接口腳位
最初是發現 i2c 信號出不去, 可是線都是通的, 研華 Q7 板上已經把 i2c 轉為 1.8V
可是我要的是 3.3V, 所以要轉, 可是轉了卻發現信號出不去, IC 用新買的不行, 懷疑假貨改用庫存品
結果還不行, 那就應該是板子設計問題, 可是都是通的啊, 目前猜測可能是接地迴圈 (ground loop)
前面提到星狀接地, Q7 板其他接地並沒有接觸到 WT-21, 螺絲孔我沒接地, Q7 接地統一走 Q7 接口
可是這個相機接口裡面也有接地, 排線一接到 WT-21 就形成接地迴圈, 這是我猜的沒有證據
但受影響的不只 i2c, 連 USB 也認不到, 而這兩樣東西的走線就在那附近, 所以才懷疑接地迴圈
由於準位轉換器無法工作, 就索性把 Q7 上的降轉轉換器給幹了, 然後跳線直出, 所以兩軟排線接口有跳線

上圖是研華 Q7, 標示 MIPI1 的接口左邊有個零件被搬走短路, 一共幹了兩顆, 另一顆在背面
結果相機看起來是有輸出了, 可是我的 imx 還是沒給我輸出, 我只能從 mipi phy 暫存器看狀態
看起來都正常, 沒報錯, 也不知道哪裡出錯了, 這可能還要再花不少時間, 我有點想換方案了...

這種模組設計最早是在山寨機上看到的

這是山寨平板, 仿 iPad, 吃 12V 電源, 雖然是山寨機但這台我用了一兩年, 之後庫存
現在為了示範把它拖出來居然還能開機XD 以前手機播影片能力不強, 筆電又太吃電
要在返鄉時的長途火車上打發時間就靠這台, 用鉛蓄電池給電可以看五個小時沒問題
這台山寨機有個炫砲功能:

可以外接 USB 以及乙太網路!在那個手機網路還不是非常普及的年代這可是好物啊XD
看一下 Android 版本:

右邊是我的手機, 看那 Android 2.2 超粗像素, 這就是時代進步的軌跡啊XD
那時的手機若是低價機種像素也是這麼粗, 而且也配電阻觸控, 我的第一隻 Android 手機就是這種

接著把這台山寨機拆開

就會看到熟悉的東西XD 就是模組下去改的, 板上印日期, 2011 年 2 月 22 日
rpi compute module 第一代出來是 2014 年中, 這貨早了三年就量產
把它拆下來看看:

威盛 WM8650, 當時山寨機主流方案, 深圳華強北出貨
子卡上的密度很高, 應該至少四層板, 最快的訊號都在上面, 引到底板的信號最快的應該只有 USB
螢幕排線看起來應該是多線平行輸出, 解析度低的螢幕這訊號速度應該不會超過 100MHz
這底板只用了雙面板, 低成本, 而且工作正常, 即使庫存了接近十年還是能用
只是這開機時間長達兩分半多可能會讓人跳腳XD
而且休眠功能好像炸了, 一按電源休眠就 Android 重啟XD
不是整個系統重開, 而是 Java 層重啟, 數十秒就完成, 無法休眠

模組的連接方式很多種, 有些用記憶體或 MxM 這種插槽的, 也有用排針, 或是特規連接器的
例如前篇做的 OMAP3530 連接 LCD

這台也還會動XD 不過觸控掛了, 要用 USB 滑鼠, 上圖畫面是 Android 2.2 Google 原生版桌面
裡面的樣子:

間距 1.27mm 的排針連接, 這台的問題是停在桌面, 也就是上上一張圖, 就這樣放著不動
過一段時間就會當機, 而且沒有任何訊息, 我不知道發生什麼事
不知道是子卡有問題還是底板, 或是軟體問題, 所以這張做完後我就很久沒碰應用處理器
搞了老半天不能用, 實在是太銷魂了XD

為了提昇技能, 經過了十幾個編號, 到了第 20 片板, 我決定再挑戰一次

這次依然不順利, 上面是 WT-20, 從板上那一堆修改的痕跡就可以知道絕對不順利
不過儘管有些功能做不出來, 至少系統都能正常開機, 也沒有出現不預期的當機, 所以才繼續干下去
研華這板子蠻坑的, 最大的坑是 Q7 第 205 腳的 5V standby, 這東西在 Q7 標準裡是列 optional
可是研華的 7421 這兩張 Q7 都是不接就不開機, 我一開始能開機完全是運氣, 但不知算好運還是壞運
我的 WT-20 能開機是因為網卡線路接錯, 3.3V 直入隔離變壓器, 有些設備是可以這樣設計的
因為那線路就是網上抄來的XD 結果那電流在 Q7 裡流竄, 可能剛好串進它的 EC, 引發開機
後來用了一段時間, 某一天突然 3.3V 短路, LDO 燒了, 查了好幾天發現網卡對地為零了
很明顯是因為接錯線導致, 由於我有多張 Q7, 於是我把掛了的那張先停用, 再次檢查線路, 和 RDK 比對
Q7 板和 RDK 都是沒有電路圖的, 只能瞎猜, 用感覺賭!
然後用各種奇怪的 "邏輯推導" 才找到這條 5V_SB, 是哪個 SB 設計的啦!給我出來!XD
除了這大坑還有一些小坑, 像是 7420 有給 Q7 接腳定義, 可是 7421 卻不給
我以為是一樣, 結果它不一樣! 例如 uart4 就改了, 我試了老半天不通
後來仔細看 Q7 金手指, 觀察接線附近零件, 刪除一些已知的, 還是可以猜到換哪去了

網卡掛逼了, 就要修囉!誰短路就干誰, 立馬掏出我那根又粗又黑又燙的東西干了它 (我是指熱風槍XD)

這是高密度多層板, 上面零件很多, 要用風槍干是要練過的, 去找老廝的片子學習學習XD
干下來後我在天貓目錄上有找到這顆, 買個回來

氧化嚴重, 這直接焊上去肯定不吃錫, 先用刀子刮一刮各接腳:

然後上助焊劑加點錫, 讓每隻腳都有吃錫:

然後把它干上去:

我干了三次才成功, 底下接地焊盤不好搞
修好了還沒確認正確線路, 又到處找資料, 然後用人體感覺比較後再跳根線

上圖箭頭指的那條, 由於 Q7 引腳沒拉, 很小心的點上去, 網路才終於通車
這張雙面板設計不當, 看看 HDMI 附近那四個共模電感, 這張板子若接 imx6d 的 Q7 是可以顯示的
可是共模電感裝上去以後居然會機機叫, 而且聲音挺大的, 但仍然可以顯示, 非常炫砲XD
後來仔細依照準則設計的 WT-21 雖然遇上 imx6dp 還是無法顯示, 但共模電感上去就完全無聲
想說是不是干擾? 於是我給 HDMI 線路疊上第五層, PCB 是環氧樹脂玻璃纖維壓成
於是我給它再鋪一層環氧樹脂, 先把 HDMI 線路圍起來

然後混合一公克的環氧樹脂, 等約一小時開始稠化時就把膠帶撕掉, 接著等固化, 結果:

然後表面貼上銅箔, 並焊接在一起後接地:

這樣就有五層板了XD 結果:沒用

這是研華 RDK 的 layout :

上圖左是正面, 上圖右是背面, 可以看到正面走過共模電感後就過孔, 孔通到背面, 但正反面都沒有看到線
可見這張板可能至少六層板, 夾在中間回 Q7, 可是這樣就違反德州儀器說的 stub 議題
可是它能動, 後來又做了些實驗, 懷疑可能是線長問題, 把我的板子 Q7 插槽和 RDK 放一起:

我的 HDMI 線長幾乎是 RDK 的兩倍長, 為什麼懷疑線長? 原因是我後來比 SD 卡傳輸
把我的 WT-21 和 RDK 疊起, Q7 插槽對齊:

可以看到 RDK 的 Q7 插槽到 SD 的卡長度幾乎是我的三倍, 而 SATA 則是約 1.5 倍
接著進行寫入測試

RDK 從 emmc 寫至外部 SD 卡:
# dd if=/dev/mmcblk3 of=mmcblk2p3/3 bs=4M status=progress
503316480 bytes (503 MB, 480 MiB) copied, 37 s, 13.5 MB/s
dd: error writing 'mmcblk2p3/3': No space left on device
123+0 records in
122+0 records out
512827392 bytes (513 MB, 489 MiB) copied, 38.073 s, 13.5 MB/s

RDK 從 emmc 寫至 SATA:
# dd if=/dev/mmcblk3p2 of=sda1/3 bs=1M status=progress
3831496704 bytes (3.8 GB, 3.6 GiB) copied, 217 s, 17.7 MB/s
3676+0 records in
3676+0 records out
3854565376 bytes (3.9 GB, 3.6 GiB) copied, 217.856 s, 17.7 MB/s
root@imx6qpsabresd:/run/media/sda1#

WT-21 從 emmc 寫至外部 SD 卡:
# dd if=/dev/mmcblk3 of=mmcblk2p3/3 bs=4M status=progress
3841982464 bytes (3.8 GB, 3.6 GiB) copied, 394 s, 9.7 MB/s
922+0 records in
922+0 records out
3867148288 bytes (3.9 GB, 3.6 GiB) copied, 402.294 s, 9.6 MB/s

WT-21 從 emmc 寫至 SATA:
# dd if=/dev/mmcblk3p2 of=sda1/3 bs=1M status=progress
3828350976 bytes (3.8 GB, 3.6 GiB) copied, 215 s, 17.8 MB/s
3676+0 records in
3676+0 records out
3854565376 bytes (3.9 GB, 3.6 GiB) copied, 215.741 s, 17.9 MB/s

RDK 寫 SD 卡沒寫完就掛了!
寫入的是同一張 SD 卡, 那卡是 16GB 的, 分割區有 14GB, 沒有空間不足問題, 只是寫失敗了
我把同一張 SD 卡和 SSD 接到 WT-21, 啥問題也沒有, 兩測試都用同一張卡開機
所以這 RDK 也不是好的, 但我相信這 bug 可能來自 SoC
沒錯, 我的 HDMI 線是拉得比較長, 但這長度和電腦比根本超短啊!
去看看鄉民最愛的 30cm 長顯卡, 走線隨便都比我長XD
我們拿別人 Q7 來做可以減輕開發負擔, 但是 Q7 板上也要走線啊, 長度就佔用一些了
到我載板上我的 IO 配置若遇產品外型限制, 有些可能要拉遠一些, 遇到像 imx6dp 這類有弱點的晶片
很可能就超過它容許範圍, 補救方式大概就是 Hub 等轉發器, 那會增加成本, 同時也是糾紛來源
所以這種方案能不能降低成本還是得看應用以及晶片特性, 沒有絕對的答案

WT-20 出廠後在我桌上躺了半年多才大致收斂, 它是跑 Linux 的
Linux 現在的源碼量已經是公認的 "個人無法完全掌握" 的了, 每一個問題查起來都非常耗時
而且不斷演進, 過幾個版本後又要重新看, 或許去跟 mailing list 可能比較知道狀況
但那種訊息量很恐怖, 除非你對 kernel 充滿熱情, 不然很快就會被海量訊息洗到疲勞
我是寫軟體的, 但寫的行數非常少, 大多數的時候我們都在看別人寫的軟體
仔細觀察其流程, 然後比對我們的硬體, 有洞就插! (寫進程式的意思XD)
這是黑手來的, 因為這種活是純硬體或純軟體人都不想碰的東西
硬體人:我已經驗過這通道能用, 剩下我不管
軟體人:我只想知道硬體吐什麼資料, 怎麼吐的我不管
可是硬體不會自己吐資料, 要軟體把通道接上, 至少 pin function 要對
接上後又依據平台有不同玩法, Linux 算最簡單的了, 如果上面還有個 Android 就很恐怖了
也因為我是做黑手的, 所以我沒有去買研華的服務, 畢竟我們是同業來的, 我有身為同業的尊嚴要顧XD
尊嚴, 是多麼虛無飄渺的東西XD
問題收斂後做了 WT-21, 確實有不少問題獲得解決, 但還是有問題沒解

把以前做過的板子全部放一起:

十年庫存, 說多不多, 說少也不少
也累積了一些經驗, 但也遇到更多無解問題, 最近友人貼連結看到居然有課程在教這種, 有點心動
不過那種大多是給相關從業人士, 我只是做玩具的而已, 如果上課時被問到做啥可能會...

修改自:https://knowyourmeme.com/photos/484199-boardroom-suggestion

變成這樣XD

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。