在OpenWRT里添加自定義機型


在OpenWRT里添加自定義機型

來源 https://www.right.com.cn/forum/thread-185335-1-1.html

 

有的時候買到一個MIPS系列開發板,上面帶有Led、以太網以及wifi功能,並且支持Openwrt系統,但是網上沒有對應的固件,這時候就需要自己修改源代碼添加Openwrt系統對開發板的兼容。下面我用身邊的一塊MT7620A開發板做個例子。

1、   首先需要找到板子需要的不死Uboot,這里推薦用H大的Breed,Breed有許多對MT7620A系統的版本,我們需要用編程器寫入Flash一個個的測試,直到測試到插入網線電腦能識別。
2、   網口能識別后,現在就需要找一個差不多能用(網口可用,但是led不正常)的機型了,這也需要一個個測試MT7620A系列的固件,這里有一個技巧,根據板子Flash類型(Nand flash、SPI flash)的不同,以及Breed系列的不同,可以快速挑選出固件,這里我找到一個機型,華碩(asus)RT-N14。
3、   找到合適的機型后,我們來確定板子上Led的GPIO號,這里我們可以用Breed的一個功能測試。
a)  重啟板子,在啟動界面不停輸入回車,直到出現breed控制台 
b)  然后輸入 btntst ,進入GPIO測試界面。
c)  拿一根鑷子或者其他導電物品,輕輕觸摸led兩側的引腳,這時候就會出現led的gpio組號、組內編號以及GPIO號(不懂得見下面)。
      i.     在OpenWrt/Linux里面,對GPIO的操作都是通過寄存器操作的,詳細可以看每個板子的DTSI文件,在DTSI文件里描述了板子寄存器的地址。
    ii.     以MT7620A為例,GPIO一共有72個,一共分了四組,組號為0~3。0組擁有24個GPIO,GPIO號為0~23;1組擁有16個GPIO,GPIO號為24~39;2組擁有32個GPIO,GPIO號為40~71,;3組僅擁有一個GPIO—GPIO72。因此,GPIO號=GPIO組號基址+GPIO組內編號。
d)  觸碰led引腳后記下GPIO的組號以及組內編號。 
4、   前面准備工作完成后下面就開始更改源代碼了。OpenWrt對設備的定義是在./target/linux下的,Linux目錄下面對應的各個平台,我這個板子是MT7620A的,那么久對應的是Rampis,
輸入 grep –rn “rt-n14” ./ 查看包含rt-n14的項,設備聲明項的文件如下

5、   我將這個開發板命名為huang-7620a(下面修改的文件都是用這個名字)下面對文件進行更改:
      i.     Diag.sh文件不用更改,這個是給led標志名稱的。
    ii.     Board.d 下的02_network為網絡配置腳本,我們可以看到,這個腳本基於shell語言腳本,用case語句匹配型號設定led,包括下面的led腳本也是。我們在ramips_setup_interfaces函數里面的in語句后面加入
   huang-7620a )
      ucidef_set_interface_lan "eth0"
      ;;
注意:eth0是你測試rt-n14固件得出來的值,大概意思就是讓系統將eth0配置為lan。
   iii.     01_leds文件為led的配置腳本,在in語句后面加入
huang-7620a)
      ucidef_set_led_default"power" "power" "huang:blue:power" "1"
      ucidef_set_led_interafce"lan" "huang:blue:lan"
      ucidef_set_led_netdev"eth" "ETH" "huang:blue:wan" "eth0"
      set_wifi_led"huang:blue:air"
      set_usb_led"huang:blue:usb"
   ;;
注意:這里我寫的有點問題,有的項開機不配置。_(:з)∠)_
    iv.     Platform.sh文件是 機型的固件頭,在刷機的時候,系統就是根據固件頭判斷固件是否適合該機型,我們只需要找到rt-n14u,復制這一行放到下一行,將rt-n14u改成huang-7620a。
      v.     Rampis.sh文件,這個文件非常重要,系統識別當前機型就是通過這個文件,大概原理有興趣的可以仔細看看里面代碼。固件啟動后會在/tmp/sysinfo目錄生成一個board_name文件,該文件會被led network配置腳本引用,通過case語句匹配然后配置網口以及led。我們找到rt-n14u,將這幾行復制放到下一行,將rt-n14u更改為huang-7620a。如下:
  *"huang-7620a")
      name="huang-7620a"
      ;;
    vi.     .DTS文件,這個文件是device tree source簡拼,是Linux里面對設備硬件信息描述的一個文件,里面涉及了系統flash類型(nand flash、spi flash)、系統分區、網口寄存器、led gpio聲明等。具體的可以到網上查相關的資料。我們這里要改的不多,只需要復制一份RT-N14U.dts,更名為huang-7620a.dts。然后打開文件,進行編輯。
1.  找到
compatible= "asus,rt-n14u", "ralink,mt7620n-soc";
   model = "Asus RT-N14U";
改成
   compatible ="huang-7620a", "ralink,mt7620a-soc";
   model = "huang-7620a";
2.  找到gpio-leds這部分,這里面是對led gpio 的聲明
3.  Label是led的名稱,對應01_leds里面的led名稱,自己可以隨便更改,但是這兩個文件里面的leds名稱必須一致。
4.  Gpios就是對應的gpio號了,這里填上前面用breed測試出的組號以及組內編號,不能有錯。
   gpio-leds{
      compatible= "gpio-leds";
      wan{
         label= "huang:blue:wan";
         gpios= <&gpio2 12 1>;
      };
      lan{
         label= "huang:blue:lan";
         gpios= <&gpio2 15 1>;
      };
      usb{
         label= "huang:blue:usb";
         gpios= <&gpio2 8 1>;
      };
      power{
         label= "huang:blue:power";
         gpios= <&gpio2 14 1>;
      };
      air{
         label= "huang:blue:air";
         gpios= <&gpio2 10 1>;
      };
   };
   vii.     Mt7620a.mk,這個文件是對機型的一些描述,包括固件空間的最大值。
1.  找到 Image/Build/Profile/RT-N14U=$(callBuildFirmware/Default8M/$(1),$(1),rt-n14u,RT-N14U),這一行,在下面添加 Image/Build/Profile/huang-7620a=$(call BuildFirmware/Default16M/$(1),$(1),huang-7620a,huang-7620a)這一行,Default后面是你的固件空間最大值,可以自行修改。
2.  找到 $(call Image/Build/Profile/RT-N14U,$(1)),在下面一行添加 $(call Image/Build/Profile/huang-7620a,$(1))
  viii.     最后的,我們需要添加機型的profiles信息,在 mt7620\profiles下面(OpenWrt的每個版本可能不一樣)新建一個 huang-7620a.mk文件,這個文件是為了在menuconfig里面顯示的,里面寫入
define Profile/huang-7620a
   NAME:=HUANG-EvilBox-7620A
   PACKAGES:=\
      kmod-usb-corekmod-usb2 kmod-usb-ohci \
      kmod-ledtrig-usbdev
endef
 
defineProfile/Default/Description
   Huangevilbox 7620a
endef
$(eval $(callProfile,huang-7620a))
6、   更改完畢后,刪除編譯目錄下的tmp,然后輸入make menuconfig,Target System選擇Ralink RT288x/RT3xxx,Subtarget選擇(MT7620 based boards),在Target Profile里面應該就能看見HUANG-EvilBox-7620A,然后簡單的選擇下,編譯,不出錯的話就能在bin里面看到固件了。
注意: led gpio配置需要更改/build_dir/target-mipsel_24kec+dsp_musl-1.1.14/linux-ramips_mt7620/linux-4.4.6/arch/mips/ralink下的mt7620.c文件,更改static struct rt2880_pmx_funcwled_grp[] = { FUNC("wled", 0, 72, 1) };這一行,72改成led gpio最小的號碼,1改成連續占用的gpio個數,比如,我led用了4849 55 51,這四個號,那么72就應該改成48,1改成55-48=7

 

================== End

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM