2012年11月9日 星期五

[Lua] identifier

識別字
  • 由字母、數字 (不能當開頭)、或「_」組成的字串
  • 可以自己把「_」預留為 dummy 變數
  • 避免使用「_大寫字母」,例如 _VERSION,Lua 保留作為特殊用途
    • _PROMPT:互動模式時的提示字
  • 保留字:and break do else elseif end false for function if in local nil not or repeat return then true until while
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006

[Lua] comment

註解
  • 任何地方「--」開始,直到行末
區塊註解
  • 以「--[[」開始,直到下個「]]」
  • 以「--[=[」開始,直到下個「]=]」,依此類推,兩邊等號數目要相等
小技巧:使用成對的「--[[」跟「--]]」,要取消註解,只要前面多加「-」變成「---[[」
--[[
--註解
--]]
取消
---[[
--取消區塊註解
--]]
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006

2012年11月8日 星期四

[Lua] Hello World

安裝:sudo apt-get lua5.2
(註:目前 Ubuntu 1304 是用 liblua5.1)

檔案:hello.lua
print("Hello World")
執行:lua hello.lua
Hello World
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006 
相關文章
  • lua教學 - 不錯的 lua Hello World 文章,應該是《Programming in Lua》某個章節的翻譯,使用 lua 互動模式使用 print 印出字串、數字,數字運算,字串運算,數字變數,io.write(),io.read()。

2012年11月7日 星期三

[OpenWrt] sysupgrade

/sbin/sysupgrade 是一個 shell 指令檔,在 OpenWrt 自動化韌體更新作業,包括保留設定檔、覆寫 firmware 分割[註]、重開機等等。

基本上,sysupgrade 需要 RAM 暫時儲存韌體及保留的設定檔。會保留的檔案或目錄紀錄在 /etc/sysupgrade.conf 跟 /lib/upgrade/keep.d/*。sysupgrade 加 -n 參數則不保留。

sysupgrade 會載入 /lib/upgrade 下的命令檔,不同 platform 需要提供自己的 platform_check_image() 來檢查更新檔是否正常,一般是 /lib/upgrade/platform.sh。此外亦可提供自己的 platform_do_upgrade() 及 platform_copy_config()。

註:raw flash 使用 mtd write,x86 跟 x86_64 用 dd,x86 的 olpc 用 > /dev/hda

參考:
  1. https://openwrt.org/docs/guide-user/installation/generic.sysupgrade
  2. /sbin/sysupgrade

2012年10月22日 星期一

[OpenWrt] preinit

一般 Linux 執行的第一個指令會是 /sbin/init、/etc/init、/bin/init、/bin/sh 其中之一 ,而 OpenWrt 將第一個執行的指令改為 /etc/preinit。

/etc/preinit 會呼叫 /lib/preinit/ 下的 script 來準備下列五組程式組,記在環境變數裡,並執行前面兩組:
  1. preinit_essential:會先執行,大致上是在掛載 /proc, /sys, /tmp, /dev 等,跟相關 daemon,以及初始化 console。
  2. preinit_main:大致包括載入 reset 按鍵驅動,設定網路界面,檢查是否執行 failsafe 程式組,初始化 hotplug,檢查是否執行 initramfs 程式組,執行 preinit_mount_root 程式組,回復系統設定,最後執行 /sbin/init。
  3. failsafe:提供 telnet 登入
  4. initramfs:似乎是空的
  5. preinit_mount_root:掛載根目錄

2012年10月10日 星期三

[設備] TP-LINK TL-WR703N

號稱市面上最小的含有 USB Host 的 Wi-Fi AP,也相當省電,低於 1W[參考來源]

主要處理器是 Atheros AR9331,內含:
  • AR7240 CPU @400MHz
  • Wi-Fi 802.11b/g/n
  • Fast Ethernet (有 5 port,但 WR703N 只用一個)
  • USB 2.0
外加 4MB Flash 及 32MB RAM

AR9331 也用在 TL-MR3020 (多開關及一些燈號)、TL-WR741ND (使用 5 port Ethernet)

由於 OpenWrt 有支援,常拿來改成其它應用。

拆解:[參考]。應該拿小一字起子,往有卡榫的地方插下去。我插在卡榫旁邊不太好拆,需要一些暴力,造成一些損傷。

接 UART 出來
  • 拆開後,正面下方的 TP_IN 及 TP_OUT 分別是 UART 的 Rx 及 Tx,如果接 FT232R 或其它轉 USB 的晶片或連接線,只需要再找一個 GND 接點。有人把 Ethernet 或 USB 的鐵殼當 GND,其實不是。除了背面的 TPGND 外,可以找的很多地方去接 GND。
  • baud rate 是 115200。
備份 u-boot 及 art:
  • u-boot 是 bootloader,損壞的話,將無法開機,也無法做任何更新動作,只能解焊 SPI Flash 透過燒錄器寫入好的 u-boot,才能讓 TL-WR703N 重新運作。有了 u-boot 之後,就可以更新其它任何部份。
  • art 是放無線校準後的資料,損壞的話,可以開機,但會影響到無線功能無法使用。這裡提到,如果沒經過校準,Wi-Fi 訊號可能會較差;也就是複製別台同樣型號及處理器的 art,未必適用。
  • 參考這裡,在 UART console 下用 Linux 的 cp 指令讀出 u-boot 及 art 分割,透過網頁存到 PC。應該也可以使用指令「dd if=/dev/mtd0 of=/tmp/boot.backup」跟「dd if=/dev/$(grep '"art"' /proc/mtd |cut -c 1-4) of=/tmp/art.backup」讀出。
加大 SPI Flash (例如改用 8MB SPI Flash)
  • firmware 修改:
    1. OpenWrt 的 tools/firmware-utils/src/mktplinkfw.c
      •  TL-WR703Nv1 的 fw_max_len 改成 0x7c0000
    2.  target/linux/ar71xx/files/arch/mips/ar71xx/mach-tl-wr703n.c
      • rootfs 的 .size 改成 0x6d0000
      • art 的 .offset 改成 0x7f0000
      • firmware 的 .size 改成 0x7d0000
    3. 編譯,結果在 bin/ar71xx/openwrt-ar71xx-tl-wr703n-v1-squashfs-*.bin
  • 最終 8MB SPI Flash 的內容應該是:
    • u-boot 複製自原本的 flash,放到 8MB flash
    • art 複製自原本的 flash,放到到最後分割,也就是位址 0x7f0000 開始的地方
    • firmware 需要改成支援 8MB Flash 後重新編譯產生,放到位址 0x20000 開始的地方
  • 解焊舊 SPI Flash,焊上新 8MB SPI Flash。
  • 參考
參考資料:

2012年10月8日 星期一

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...