目前分類:0&1的語言 (11)

瀏覽方式: 標題列表 簡短摘要
  經過眾版友的交涉,網樂通總算放出自己的kernel source了!

  不過,既然網樂通本身使用了Linux,依照開放源碼的授權條款來說,它本來就該無償提供原始碼給其他人下載。

  下載頁面在 https://www.nextvod.com.tw/tw/yiwangle/opensource.jsp ,希望這個原始碼能幫助詭異的RT73無線網卡乖乖工作。

stevennick 發表在 痞客邦 留言(1) 人氣()

2011-02-20_215458

以下內容已經同步發表於「批踢踢實業坊」NextVOD看板。此內容為我在研究網樂通硬體與驅動的結果。

NextVOD USB wireless device kernel modules package
For firmware version 103
Author: Ciou Stevennick stevennick(at)ms32.url.com.tw
WARNING:This package is not designed for normal user, use at your own risk!

警告:私自修改網樂通將有可能會毀損機器,並同時喪失保固或被要求賠償最高3000元新台幣!本程式並未經過完整測試,且現階段的網路驅動程式尚未能與網樂通介面完全整合,一般使用者請勿輕易嘗試!

這是甚麼
======
這是使用於網樂通機器上面的無線網卡驅動程式模組,並且包含了一些可用的工具程式與自動啟動執行檔,使得網樂通可以使用更多不同類型的無線網路卡進行連線。另外,為了方便程式測試,安裝本模組將會自動啟動正常模式下的telnet伺服器,使用者將可透過telnet指令遠端登入網樂通的命令模式介面。

環境限制
======
1. 可能可以支援的網路卡(以晶片組區分):

Realtek RTL8712/8187/8188/8191/8192SU
Marvell 8xxx/8388
ZyDAS ZD1201/1211
Ralink RT73

其中,rt73核心模組尚有部份問題,可能無法正常工作。
另外,因為個人設備有限,僅有Realtek的核心模組測試過確定可以動作。若有人願意商借更多相關網卡供測試使用,未來版本(若有的話)將有可能擴充支援更多無線網卡。
部份的核心模組有修改原始程式碼。相關的修改將會在作者網站上提供。

2. 基於網樂通系統的先天限制,在安裝模組時與第一次網樂通進行冷開機時,可能會需要使用有線網路進行網路環境設定。使用者必須在網樂通的網路安裝設定畫面內,將區域網路設定為靜態環境,令網樂通跳過有線網路的DHCP搜尋。

3. 韌體更新後,需重新安裝模組才能再次發揮功能。另外,也不保證本驅動模組能在未來版本上的韌體正確執行。

4. 由於網樂通無法管理ralink以外的無線網路卡,因此這個模組中包含了wpa_supplicant以及工具程式wpa_cli來取代網樂通內建的管理程式,另外也包含了ifup/ifdown指令可配合使用。使用者需要手動設定 wpa_supplicant 設定檔案(安裝後,路徑在 /etc/wpa_suplicant/wireless.conf),加入正確的無線基地台名稱、加密方式,密碼等無線網路參數,才能使wpa_supplicant正常工作。
在本安裝內,已經包含了兩個範例檔案可供使用,分別為wireless.conf與plaintext.conf,提供WPA/WPA2-PSK與無加密的組態供設定參考。詳細的設定指令,請參考下面的說明連結。
Gentoo 的說明文件(中文)
http://www.gentoo.org/doc/zh_tw/handbook/handbook-x86.xml?part=4&chap=4
wpa_supplicant作者網站 (英文)
http://w1.fi/wpa_supplicant/

5. 所有設定檔案僅針對網路介面 wlan0 做組態設定,若你掛入的網路介面不是這個名稱,則有兩種方式讓這個集合可以重新工作:
1) 修改/etc/udev/rules.d/99-udev-net-test.rules 檔案,取消第六行的註解後重新開機,或者
2) 修改本集合在/etc/下的所有相關設定檔案,將wlan0改成正確的網路介面名稱。
要查詢你的網路介面是否正確工作或取得介面名稱,請在安裝集合以後,於命令模式下輸入下列指令

cat /proc/net/wireless

6. 提供的安裝流程,僅適用於自動取得IP位址的無線網路環境,並且安裝時需要使用網路(下載安裝檔)。
若要使用隨身碟進行離線安裝,請自行下載安裝步驟第三部份的檔案,參考網樂通改機一文中,掛載隨身碟的說明。

安裝步驟
======
以下為網路安裝步驟。

1. 請先取得網樂通的命令模式介面控制權。並且,請確定網樂通可以連上網路。要取得控制權,最簡單的方法就是拆機器,並使用內部的Console port與電腦連接。
另外,也請確定網樂通運作在正常模式(即螢幕畫面為頻道選單)而非韌體更新模式下。

2. 切換到臨時資料夾。此例為/tmp

cd /tmp

3. 下載並驗證安裝檔案

wget http://dl.dropbox.com/u/18601667/wlanhack_test.tar.gz
md5sum wlanhack_test.tar.gz

請至網站上確定你的檔案驗證碼與網路上公佈的一致。

4. 解開安裝檔案,並且安裝基本程式

tar -xzf wlanhack_test.tar.gz
cd wlanhack_test
./install

5. 設定你的無線網路環境

./get_sample_config
vi wireless.conf

進入vi後,按下鍵盤i鍵後開始修改設定值。可以使用方向鍵與倒退鍵
完成設定後,依序按下ESC鍵、Shift + ;、w鍵、q鍵與Enter 離開 vi

如果不小心改爛設定值,可以重作第五步驟。vi操作說明操作請上網搜尋。
欄位說明,請參照環境限制內,關於wpa_supplicant的部份。

6. 安裝設定值

./config_install

7. 測試你的設定
請先將欲使用的無線網路卡接上網樂通,然後輸入下面指令開始測試:

./test_install

這個指令將會重新啟動udev、重新載入網路卡的核心模組、並啟動wpa_supplicant
來進行測試連線。若有成功驅動網路卡且設定正確,最後你應該會看到類似下面的資訊:
(請注意:訊息的出現順序可能會不太一樣)

Selected interface 'wlan0'
bssid=00:xx:xx:xx:xx:xx
ssid=My ssid here
id=0
pairwise_cipher=TKIP
group_cipher=TKIP
key_mgmt=WPA-PSK
wpa_state=COMPLETED
ip_address=192.168.1.5

Inter-| sta-| Quality | Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
wlan0: 0000 96. 96. 0. 0 0 0 0 0 0

若沒有看到ip_address欄位有數字出現,則表示第五步驟的設定有誤,請回到第五步驟重新確定設定值。若你的interface欄位wlan0而是其他代號,表示你需要套用環境限制內第五項說明的修正。若你的interface欄位沒有任何東西,則表示網路卡驅動失敗。您可以考慮解除安裝本集合,並等待未來更新。

若要套用環境限制內第五項說明的修正,請執行下面的指令

vi /etc/udev/rules.d/99-udev-net-test.rules

使用方向鍵移動到第六行開頭,按一下x鍵刪除#字號
完成設定後,依序按下ESC鍵、Shift + ;、w鍵、q鍵與Enter 離開 vi

8. 清理安裝檔案

./cleanup

9. 將網樂通重新開機,設定靜態網路位址

請保持無線網路卡與網路線皆插在機器上並且重新開機。重新開機後,進到網路狀態內將網路設定值抄寫下來。
然後,請進入安裝設定中的區域網路設定,將網路設定值使用手動設定方式,手動加入一個合法的IP位址、子網路 遮罩、通訊閘以及網域名稱伺服器位址。您可以參考接上網路線時,網路狀態內所顯示的相關內容作相同設定。這個步驟的目的是要避免網樂通執行動態IP查詢,實際上網樂通還是會使用無線網路的設定值來連線。
設定完成後,按下設定畫面的確定按鈕。請確定螢幕顯示連線成功訊息。離開設定畫面後,移除網路線並重新開機。

10. Enjoy your NextVOD!

Versions
========
2011/02/20 測試版發布
2011/02/21 修改測試程式

stevennick 發表在 痞客邦 留言(4) 人氣()

1. 要設定正確的核心起始位置、Offset與正確的系統頻率。當然必要的Device Driver也要記得掛入。我已經改出可用的 Kernel config(當然也加入了一些修改),可以到這裡下載: http://0rz.tw/r3LP9

2. 網樂通的rootfs是放在USB Stick上的,但是USB Stick要配置sd分割區之前,會經由USB probe到SCSI子系統上,再由核心找出正確的檔案系統以後才會產生sdX的資訊。但是,整個識別過程需要一些時間,若沒有做核心Hack,核心的init就會在sdX來不及產生前就嘗試掛載它,這會導致kernel pantic:


VFS: Cannot open root device 'sda2' or unknown-block(8,2)
Please append a correct 'root=' boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,2)


解決方法有兩種,我們可以在u-boot時,修改內建的bootargs,在尾端加上rootdelay=xx,xx表示要init等待的秒數,一般來說五秒足矣。若有些裝置(例如SD讀卡機或是硬碟等)需要更長的時間,就把秒數增加就好。
另外一種就是kernel hack,在核心程式碼 init/do_mounts.c 內,prepare_namespace() 函式實作內部加上delay:


if (root_delay) {
/* ... */
}
/* Stevennick Hack: force wait 5 seconds for device becomd ready. */
/* See https://blueprints.launchpad.net/ubuntu/+spec/kernel-boot-usb-roodelay */
ssleep(5);

/* ...*/


然後重新編譯kernel,應該就可以避免掉這個問題。

當然,由於我沒有網樂通的JTAG connector可用,在怕把u-boot弄壞的情況下,實在不敢下saveenv指令,不然,直接加上rootdelay參數,其實是比較好的解法。

若使用網樂通內部的核心開機,我們也會發現核心在掛載系統前會很明顯的暫停了一會,或許正是等待usb裝置就緒吧!

stevennick 發表在 痞客邦 留言(3) 人氣()




這部影片所展示的內容,其實是我在上學期的一門計畫結果。原本的計畫結果是沒有錄製影片的,但因為在相關課程的期末簡報上,老師下了最好有展示影片的期望,這部影片也才因此誕生。而就在最近,生產PXA310的廠商打電話來說內部的工程師最近看到這一段影片,我才想起來我曾經做過這個計畫...

系統的架構其實很簡單,就是兩個不同的平台整合(Marvell PXA310嵌入式開發平台上跑Linux/Android,還有TI CC2530開發版,上面純跑8051而非Z-Stack)在一起,中間使用Serial 連在一起。因為Linux上的ZigBee接收端,變成標準的Serial console,所以等於是我只要寫操作Serial的程式就可以控制ZigBee了。不過,為了方便,我是在Serial上加了一層網路服務程式,讓ZigBee資料可以透過本機端Socket進行傳輸,所以那個Android Demo UI其實是個連到本機Socket的網路應用程式。也因為資料走網路的關係,只要嵌入式平台有連上網際網路,那個Android UI程式是可以透過遠端啟動的。

但可惜的是,那時候的準備時間並不充裕,相關的程式實做僅到了可以執行(Just work)的階段。若是往後有機會從事這方面的發展,我想我應該會做的比現在要再好上許多。

stevennick 發表在 痞客邦 留言(1) 人氣()

  這裡純粹紀錄做過的事情,不保證一定成功。

環境準備:

  首先,先Google STLinux 下載2.3的ISO,另外我的電腦是跑Ubuntu,必須使用更新的install script。把下載的ISO解開複製到某個目錄內,把install用剛剛下載的新版檔案蓋掉。

  先用apt-get安裝rpm套件,再切換到superuser啟動 install script。安裝後的內容會放在 /opt/STM/STLinux-2.3 裡面。

  先到 host/bin 內執行 stmyum update 升級安裝,這樣就會取得最新的 kernel 2.6.23.17 source 與更新後的套件,由於網樂通剛好用相同版號的kernel,剛好省下了自己找kernel的麻煩。

設定環境:

  將適當的PATH加入環境變數中,這樣make才找得到STLinux的toolchain。

  然後,複製STLinux的source tree到自己的working directory,就可以開始工作了。

Start working:

  我們要先找出正確的平台組態,所以先看看目前的 kernel支援哪些平台:

  make ARCH=sh CROSS_COMPILE=sh4-linux- help

  在Architecture specific targets中,找到了符合網樂通平台的pdk7105,所以直接下pdk7105_defconfig就可以產生可用的.config文件:

  make ARCH=sh CROSS_COMPILE=sh4-linux- pdk7105_defconfig

  接下來,就可以修改核心選項,加入我要的RT73無線網卡Driver(跟一堆東西):

  make ARCH=sh CROSS_COMPILE=sh4-linux- menuconfig

  然後編譯kernel:

  make ARCH=sh CROSS_COMPILE=sh4-linux- vmlinux

  有四核心的電腦,下編譯指令時加上 -j4可以節省編譯時間。

開機測試:

  首先,我們要先確定網樂通的硬體配置為何,這可以很簡單的透過u-boot輸出訊息取得:

## Booting image at 80000000 ...
Image Name: Linux 2.6
Image Type: SuperH Linux Kernel Image (gzip compressed)
Data Size: 2459057 Bytes = 2.3 MiB
Load Address: 80800000
Entry Point: 80801000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
CMDLen=169
There is "hwaddr" keywords! Position=95
Read MacAddr=24cf21b0ab14

[iptv_kernel]:Starting kernel console=ttyAS0,115200 root=8:2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:24:cf:21:b0:ab:14 phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048 - 0x00000000 - 0 ...

  其中,Load Address跟Execute Address(即Entry Point)要記下來,等下會用到。
  另外,也可以下pri指令,就可以發現u-boot其實是讀入隨身碟的第二磁區根目錄內的vmlinux.ub來開機。

PDK7105> pri
bootdelay=0
baudrate=115200
ethaddr=DE:EA:FF:FF:01:01
board=pdk7105
monitor_base=0xA4000000
monitor_len=0x00040000
monitor_sec=1:0-1
load_addr=0x80000000
ipaddr=192.9.150.61
serverip=192.9.150.67
bootdelay=0
update_uboot=usb start;fatload usb 0 80000000 u-boot.bin;update_spi_uboot
unprot=protect off $monitor_sec
update=erase $monitor_sec;cp.b $load_addr $monitor_base $monitor_len;protect on $monitor_sec
ethaddr=12:34:56:78:06:BD
stdin=serial
stdout=serial
stderr=serial
bootargs=console=ttyAS0,115200 root=8:2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:10:08:E2:12:06:BD phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048
bootcmd=ext2load usb 0:2 80000000 vmlinux.ub; bootm 80000000

Environment size: 715/65532 bytes

  所以如果要做一個相容核心的話,我們還要做一些指令,讓核心變成可以在網樂通上開機的vmlinux.ub:

  sh4-linux-objcopy -O binary vmlinux vmlinux.bin
  gzip --best --force vmlinux.bin
  mkimage -A sh -O linux -T kernel -C gzip -a 0x80800000 -e 0x80801000 -n "Linux 2.6" -d vmlinux.bin.gz vmlinux.ub

  其中,-a 跟 -e 後面的選項就是剛剛開機訊息裡面提到的Load Address跟Execute Address實際位址。

  在不修改任何設定值的情況下,編譯好的kernel只有1.7MB,跟網樂通內附的kernel有很大差距。不過只要編譯過的kernel可以動就好,畢竟我的重點是編譯Wifi Driver Module。

stevennick 發表在 痞客邦 留言(3) 人氣()

對於End user來說,網樂通是個挺不錯的免費影音大集合(至少到2011/3/31以前都是如此),不過作為一個CSIE背景出身的人,對於具有256M記憶體/8G USB Flash還有Ethernet跟USB Port 又可以街電視的機器,不拿來做點嘿嘿應用就太可惜了...

所以,經過了一個多月的等待,拿到機器的第一件事就把它給砸了拆了(好孩子不要學),先把 8G Flash 備份後就接上Serial Console看看有啥搞頭!

機器是跑 STLinux 2.3 ,kernel 2.6.23.17_stm23_A18B-PDK7105-32BITS-A18B,pdk7105-sdk/STx7105 ver 3.x 還外帶u-boot,這下還真的很有搞頭。美中不足的是,裡面的啟動script亂成一團,走了好多冤枉路 花了整個晚上才搞清楚網樂通實際上是怎麼正常啟動的...

目前Hacks:

[sda2]/etc/init.d/fdtv-init.sh 裡面加入

/sbin/udhcpc -i eth0 -nq -t 3 -T 15 &
/usr/sbin/telnetd -l /bin/sh &

就可以用telnet連進網樂通,裡面也有busybox所以有wget可用,但若要寫程式進去,在Host弄個STLinux rootfs 再透過NFS餵給網樂通應該會比較方便

Anyway,最近論文比較忙沒空玩它,先記下來一些資源跟work,等未來老闆開課時再忙裡偷閒玩玩好了...

資源區:
網樂通拆解 http://3c.msn.com.tw/View.aspx?ArticleID=54883&pageIndex=1
STLinux: http://www.stlinux.com/
H/W Spec & dmesg: https://gist.github.com/753181/ecbc2946ca83d519b94374242bceda802a6db0d4
HackingThursday: http://groups.google.com/group/hackingthursday
(Keyword: nextvod)

Porting:
也許來個strace?
strace: http://sourceforge.net/projects/strace/

無線網卡目前只支援 Ralink RT3070STA,而且還是用打模組的方式加進kernel中。我對RT73的Driver比較有興趣,要是能把Driver編好打進去,網樂通就可以用便宜的華碩的無線網卡了。


stevennick 發表在 痞客邦 留言(7) 人氣()

  今晚奮鬥很久,為了要幫舊電腦上Ubuntu 8.10,著實費了好一番功夫。

  後來在安裝顯示卡驅動時卡關,不論是原廠驅動還是Ubuntu內建套件都無法正常驅動,找了相關討論串才恍然大悟:"X.org 5.x server confict with nvidia legacy driver"。因為Ubuntu 8.10用了X.org 5.x,所以要不是我downgrade到 Ubuntu 8.04,不然就只能選內建的 nv driver。

  最後的討論串更殺,直接給了Release notes的連結,擺明了說目前無解。

  所以奮鬥一整晚上的最大心得,就是"Read The FRIENDLY Manual" frist...

stevennick 發表在 痞客邦 留言(0) 人氣()

  由於無名小站站方禁止在網誌側攔加入JavaScript,故TravelLog已不能正確運作在無名小站的測攔內。

  這個限制還真是令人討厭。

stevennick 發表在 痞客邦 留言(0) 人氣()

  Ajax的完全動態應用『gaaan.com』,使用了現有的網頁技術實做了類似電子佈告欄系統bbs的內容。更神奇的是,連操作方式都跟真正的bbs一樣使用鍵盤(和滑鼠,它同時接受滑鼠作為資訊輸入媒介),雖然目前功能尚未完備,整個網站也屬於實驗性質,不過這類應用再過不久或許也有可能帶動資訊新潮流。

  網址:http://gaaan.com/

  

stevennick 發表在 痞客邦 留言(0) 人氣()

  Catalyst,一個基於Perl的MVC Framework,目前最大的用途與Ruby的Ruby on Rails相同,即是適用於開發Web2.0 Application。然而不同於以往的Web開發方式,使用MVC(Model-View-Controller,發祥於Smalltalk)架構來使開發者省卻繁瑣的問題,而能集中全力在要解決的核心問題上。

  另外,Catalyst也支援AJAX,是個後勢看好的Framework....但是糟糕~我還不會使用MVC呀!(欸~)

  Catalyst Home page:http://www.catalystframework.org/

stevennick 發表在 痞客邦 留言(0) 人氣()

  承襲上次試用iTunes不慎失誤所造成的慘痛代價 ,我被賦予的任務就是要將所有被自動更改位置並且被更動檔名的所有檔案都修改回來。但....三千多個檔案可不是個小數目,不是我說想改回來就改回來的,至少....不能叫我坐在電腦前面一整天只為了整理這堆音樂檔案吧?

  於是,如何在短時間內把檔案修改完成的計畫,就悄悄的在我的電腦上運作著...

  所謂『工欲善其事,必先利其器』,要把檔案改回來,首先當然要知道哪些檔案已經被更動了。根據當時iTunes的設定值來看,我在G:MP3裡面的所有檔案,只要是副檔名為MP3的檔案,全部都經由iTunes的整理而變的非常規則,換句話說,我們只要找出所有副檔名為MP3的檔案,就可以確定到底要動到哪些檔案了。

  但是,我所使用的Windows既沒有在UNIX上可以使用的 find 工具,內建的搜尋功能又破腳到不行,要怎樣才能快速且精確的取得所有修改的檔案呢?於是,我便利用了 Perl 著手寫出下面的Perl Script 來幫助我取得這些被更改過的檔案清單:

#!/usr/bin/perl
print " ";
$ext_path="./";
open (FIL, ">>123.txt") or die "Cannot open save file! ";
&get_filelist($ext_path, "");
close FIL;
#print "@dir";
sleep 3;
exit;











  而這個Script最精華的部分,就在於下面的 get_filelist() 副常式:

sub get_filelist {
 my ($dir);
 my (@filelist, @dir);
 my ($entry, $type, $man, $exr, $ext, $drop);
 opendir (DIR, "$_[0]") or die "Cannot open $_[0]! ";
 
 foreach (readdir DIR) {
  next if (($_ eq ".")||($_ eq ".."));
  $type = -d "$_" ? "dir" : "file";

  if ($type eq "file") {
   print "File: $_[1]$_"." ";
   print FIL "File: $_[1]$_"." ";
  } elsif ($type eq "dir") {
   print "Dir : $_[1]$_"." ";
   print FIL "Dir : $_[1]$_"." ";
   chdir "$_" or die "Cannot change directory to $_:$!";
   print "*** Change current DIR to $_[1]$_ ***"." ";
   print FIL "*** Change current DIR to $_[1]$_ ***"." ";
   get_filelist("./", "$_[1]$_");
   chdir ".." or die "Cannot change directory to $_:$!";
   print "*** Change current DIR to $_[1] ***"." ";
   print FIL "*** Change current DIR to $_[1] ***"." ";
  }
  
 }

 closedir (DIR);
 return @filelist;
}

































  在一開始的前5行,只是很簡單的宣告變數,以及一個開資料夾的步驟而已。接下來,讀取資料夾中的所有檔案,並且利用正規表示式過濾掉開頭為 . 或  .. 的檔案,然後在順便確定一下讀到的東西是檔案還是目錄,如果是檔案的話就將檔案名稱連同路徑一起儲存到 123.txt 當中;若是目錄的話則使用遞迴呼叫移至該目錄底下並且繼續讀取檔案。

  不一會兒〈好吧!嚴格說來是大約過了十秒鐘之後〉,所有變動的檔案都連著它們的路徑乖乖的儲存在 123.txt 當中啦!或許各位看倌會覺得奇怪,取得檔案目錄有哪些好處?嘿嘿!它可幫了我不少大忙,稍後會介紹另一個神奇的 Script ,它將會以驚人的速度來完成這個艱鉅的任務,請大家拭目以待嚕!

stevennick 發表在 痞客邦 留言(0) 人氣()