2023年2月11日 星期六

I've reach my Raspberry pi usb current limit, so I've Hack my USB hub.

前言:
我有很多舊的小容量micro sd卡,外接USB Hub,透過usb讀卡機,接到我的Raspberry pi 3,再加上一個sata-usb轉換器,接上小容量SSD,透過btrfs建立一個raid10,當作NAS來使用

最近拿到一台二手的Raspberry pi 4,所以打算來升級我的NAS
(最近兩年Raspberry pi 4缺貨跟漲價實在是太誇張了...)

因為舊的Raspi3只支援usb 2.0,所以當初使用的usb讀卡機許多是usb 2.0的,升級到Raspi4之後,因應Raspi4有支援usb 3.0,所以順帶把所有讀卡機、sata-usb轉換器都換成USB 3.0

沒想到全部更新後,開始出現問題

  • 有很高機率開機會hang住
    (沒辦法正常開機,因為開機時mount btrfs失敗)
  • 正常開機後,對btrfs操作,寫入或讀取資料,有很高機率會出現錯誤,當出現錯誤之後,連同接在Raspi上的keyboard, mouse都沒辦法工作
分析:
從現象可以推測,應該是碰到Raspi的USB current limit,觸發OCP保護
單一個USB port,或全部USB port,總電流超過1.2A就會觸發OCP保護,導致所有usb device被強制斷電
https://support.thepihut.com/hc/en-us/articles/360015272218-How-much-current-can-I-draw-from-a-Raspberry-Pi-USB-port-

對策:
首先可以考慮可以外接電源的USB Hub
但實際上外接電源USB hub會衍伸其他問題
一種問題是USB hub外接電源逆向供電給Raspi,這個容易出現在低價型的USB hub,不確定是Cost down還是本身設計不良,如下圖

外接電源的DC jack,直接以0ohm貼片電阻連接到主要的Power rail,0ohm貼片電阻的零件名稱是D4,表示原先可能是要放二極體,但如果這個位置貼上二極體,當DC jack供電跟USB cable連接電腦同時存在,還是會由USB cable供電,所以我不確定這是不是設計不良。
可能也是因為這個緣故,所以改貼0ohm電阻直接短路。

所以需要一個可以外接電源,而且外接電源不會逆向供電的USB Hub,所以我拆了我的另外一個USB Hub

這個設計就比較合理,以二極體隔開外接電源與USB 電源,當USB電源沒有連接的時候,外接電源不會逆向供電回到USB電源
同時如果外接電源跟USB電源同時存在,以外接電源供應USB Hub電流

實際測試後,確實可以改善Raspi usb電流限制的問題
但又有新的問題,當Raspi關機或是重啟,USB hub因為連接外接電源,實際上不會斷電
這造成usb hub上的設備,有可能因為沒有斷電,下一次開機時沒辦法正常初始化usb設備

所以,我需要一個可以外部供電的USB hub,不會逆向供電給USB Host,當USB Host斷電時USB hub也會同時斷電

實做:
我找了一個現有的buck converter module
(身為一個工程師,手邊隨時有一堆module也是很合理的)

Buck convert IC是mp1584en,接著研究一下datasheet,看看這顆IC的enable有沒有enable功能,以及研究一下這個module可不可以拉出enable pin來控制
有Enable pin,正邏輯,Enable pin超過1.5v時enable output,Enable pin內部有pulled up到3v,內部pull up電阻不確定,但敘述有提到1uA current source,所以推測內部pull up resistor應該很大
考慮到Enable pin有Pull up到Vin,考慮不移除pull up resistor,直接串接的情況下,在USB hub這端透過電阻分壓,確保Vbus沒有連接的時候,Venable可以降到足夠低,同時避免Vin串到Vbus

接著評估怎麼修改
在Hub上找出對應的Pad跟Net,在Ground上找到對應位置,刮除綠漆,提供電阻焊接的位置

接著在Buck converter找出Enable pin的net,方便焊接的點
連接兩塊板子
檢查新增加的電阻、接線,有沒有短路,接觸到其他元件接點或是Pad
都正常之後上電測試,檢查電路工作是不是符合一開始的設計規劃
用三用電錶量測 Buck module Vin電壓,VBus in的時候VEnable電壓,VBus out的時候VEnable電壓,工作正常!
最後組裝

我得到一個可以外部供電(寬電壓輸入,但電壓需要再計算,至少12v可以工作)
不會逆向供電給USB Host,當USB Host斷電時也同時會關閉外部供電的USB Hub!

現在我的Raspi 4工作正常了~

沒有留言:

張貼留言

Fix msmtp does not work in old ubuntu/debian version

主要是舊版msmtp沒有處理好email header 現在的smtp伺服器會檢查mail header 寄件人跟帳號不一致不給寄 收件人不是合法mail address自然不能寄 #!/bin/bash # Workaround until mtmsp >= 1.8....