2012年10月8日 星期一
[OpenWrt] min. flash and RAM
OpenWrt 至少要有 4MB flash 及 16MB RAM。有些 2MB Flash 或 8MB RAM 的無線路由器 -- TL-WR702N 等,就無法執行 OpenWrt,但基於 Broadcom 處理器的在 DD-WRT 還勉強可以。
2012年10月6日 星期六
OpenWrt LED
無線路由器有許多 LED 顯示狀態。在 OpenWrt 下,如何控制 LED 呢?
除了電源狀態 (PWR) 是有電就亮,及一些 Ethernet 狀態 (WAN 和 LAN 1 2 3 4) 是 Ethernet Controller 直接控制外,其它 LED 是接到 SoC 的 GPIO,Linux Kernel 有個 platform 子系統,並有一些針對 GPIO 的現成驅動程式,例如驅動程式 leds-gpio 用來控制 LED。只要把 GPIO 的位置,所使用的驅動程式及功能在編譯前設定好,編譯後的 Linux Kernel 就能支援這些 GPIO。
編譯後的 Linux 就會有 /sys/class/leds/tl_wr1043nd:green:wlan/ 目錄。使用方式,例如
點亮 LED:
除了電源狀態 (PWR) 是有電就亮,及一些 Ethernet 狀態 (WAN 和 LAN 1 2 3 4) 是 Ethernet Controller 直接控制外,其它 LED 是接到 SoC 的 GPIO,Linux Kernel 有個 platform 子系統,並有一些針對 GPIO 的現成驅動程式,例如驅動程式 leds-gpio 用來控制 LED。只要把 GPIO 的位置,所使用的驅動程式及功能在編譯前設定好,編譯後的 Linux Kernel 就能支援這些 GPIO。
- 準備資料結構 struct gpio_led,內含每個 LED 名稱、GPIO 接腳、是否 low 動作等。例如:
static struct gpio_led tl_wr1043nd_leds_gpio[] __initdata = {不清楚 LED 名稱為何要取
{
.name = "tl-wr1043nd:green:wlan",
.gpio = TL_WR1043ND_GPIO_LED_WLAN,
.active_low = 1,
}
};
tl-wr1043nd:green:wlan這麼一長串 - 透過 platform_device_alloc() 取得使用 "leds-gpio" 的資料結構 struct platform_device。(相反是 platform_device_put())
- 建構資料結構 struct gpio_led_platform_data,包括 LED 數目,及 leds 欄位指到 struct gpio_led
- 透過 platform_device_add_data() 加進 struct gpio_led_platform_data
- 透過 platform_device_add() 登記到 Linux Kernel
編譯後的 Linux 就會有 /sys/class/leds/tl_wr1043nd:green:wlan/ 目錄。使用方式,例如
點亮 LED:
echo 1 > /sys/class/leds/tl_wr1043nd:green:wlan/brightness熄滅 LED
echo 0 > /sys/class/leds/tl_wr1043nd:green:wlan/brightness應該還有其它用法,待了解。
2012年9月21日 星期五
FXS 轉 UART
連接話機的界面是 FXS (Foreign eXchange Station),連接局端的界面是 (FXO, Foreign eXchange Office),FXS 或 FXO 轉換成其它界面叫 ATA (Analog Telephone Adaptor)。網路上可以找到兩個將 FXS 轉成 UART 的專題,都是 David Rowe 的傑作:一開始的「 $10 ATA」跟構想延伸的「Mesh Potato 的 FXS 界面」,想在無線路由器加 FXS 界面,而 UART 是無線路由器都有的界面,只藏在裡面的電路板上,baud rate 115 kbit/s 就夠 64 kbit/s 的語音使用。
「$10 ATA」後來也受到 Mesh Potato 影響,但最後資訊是去年三月,之後可能沒有進展,或者作者未公佈,主要缺如何一起在 UART 傳振鈴及 hook 資訊,跟整合測試。其架構如下:
「$10 ATA」後來也受到 Mesh Potato 影響,但最後資訊是去年三月,之後可能沒有進展,或者作者未公佈,主要缺如何一起在 UART 傳振鈴及 hook 資訊,跟整合測試。其架構如下:
+---------------+ +--------------------+
| Hybrid |<->|ADC/PWM |
話機-| DC-DC/ringing |<->|PWM/ADC ATmega328P |--UART
| hook detector |-->|PWM |
+---------------+ +--------------------+
ATmega328P 是 AVR 八位元微處理器,也用於 Arduino,可以處理類比訊號,用其 ADC 及 PWM 來轉換類比訊號。作者一系列文章:
- A $10 ATA
- USBtiny 使用 ATtiny,每個 USB bit 中斷一次,相當於 10MHz。Zaptel 只需要 1KHz (1ms)。ATtiny 價格只需要 $1.5,比一般 USB 界面 IC 便宜。
- AT3344: AVR Phone Recorder and Telephony Platform 使用 $5 ATMega microcontroller. As well as recording telephone signals and communicating with a host PC, the AVR also finds time for some real time DSP (DTMF decoding). ATMega 有一些 DSP 功能,例如 2 cycle multiply。
- 有電路圖。FXO 基於 Joe Randolph’s “Low Cost Telephone Line Interface DAA, FXO” application note with some changes of our own to allow monitoring the line even when idle.
- 有 DTMF decoder 範例程式
- http://www.radiolocman.com/shem/schematics.html?di=64371
- http://www.radiolocman.com/shem/schematics.html?di=64492
- FXS 等效電子模型
- $10 ATA Part 2 (電路圖、原始碼)
- 用一個 PWM 做 -48V DC-DC converter 線路來自已有的 FXS 模組,用 PWM 控制,並用 ADC 偵測電壓
- 用 ADC 偵測電流,用 Gyrator 等效電感
- 用 ADC 跟 PWM 通語音
- $10 ATA Part 3 – Hybrid
- 增加 Hybrid 電路,Gyrator 等效電感改為兩個
- AVR 程式 uart2analog 提供 UART 跟 ADC/PWM 的轉換
- $10 ATA Part 4 – Building a DC-DC converter with a microcontroller
- $10 ATA Part 5 – Ringing a Phone with a DC-DC Converter
+--------+ +--------------------+ +------------+
| |<--|SPI |<-|GPIOs |
話機-| Si3210 | | CPLD | | AR2317 |
| |<->|TDM |->|UART Rx |
+--------+ +--------------------+ | |
| ATmega8L(16B FIFO) |<-|UART Tx |
+--------------------+ +------------+
AR2317 是 Atheros 的無線 MIPS 4KEc SoC,用於 AIR-300 等無線路由器。Si3210 是 FXS 界面晶片,包括 hybrid、DC-DC converter、振鈴、hook 偵測等,語音走 TDM,控制走 SPI。CPLD 主要是要轉換 UART 跟 TDM,但可能是內部 buffer 不夠,所以加 ATmega8L。- 產品 MP01,除了可以 PoE (Power over Ethernet) 外,還可以 PoTL (Power over Telephone Line)。[參考]
- 電路圖,CPLD 及 README,
- 8250mp.ko 驅動程式,改自 m8250, 提供雙向各 320 bytes FIFO,及 /dev/8250mp
- mp.ko 驅動程式, 用 GPIO 模擬 SPI 來控制 Si3210,並提供 /dev/mp 以便取得 hook 狀態及通知產生振鈴。
- Asterisk PBX chan_mp.so 通道模組, 並使用 user mode echo cancellation
- 原始碼檔案庫
- http://www.rowetel.com/blog/?p=70
- http://villagetelco.org/blog/
參考
- Silvertel Ag2130 PSTN 界面模組。(RT03106)
- USB FXS
FT232R
FT232R 是一個 USB 轉 UART 的晶片,整合 clock 及 EEPROM 等,讓線路非常簡單。有些 Arduino 含有 FT232R 來提供 USB 界面,例如 Duemilanove、Diecimila,但新的 Leonardo 使用 ATmega32u4 處理器已經內建 USB 了。FT232R 除了 UART 功能外,亦可作為 Clock 產生器,透過 bit bang 模式提供 GPIO 或 SPI 功能,或者作為 FTDIChip-ID™ security dongle 功能。
FT232RL IO 訊號
CBUSx 都可以設定成任何 CBUS 功能,除了表列五種外,尚有 TX&RXLED#、6/12/24/48 MHz clock 輸出。
內部 EEPROM,整理自 datasheet 及 libFTDI。
USB 的請求控制指令:
實際應用
- 相關文件:Datasheet、Bit Bang Application Note、FTDIChip-ID™ Application Note
- 內建 128 bytes EEPROM 作為設定用,其中 Manufacturer, ManufacturerId, Description, SerialNumber 字串最長 96 bytes,沒用完的可作為 user area 或 FTDIChip-ID 使用。
- 可產生 6/12/24/48 MHz clock
- Big Band I/O
- Asynchronous:UART 8 IO 作為 8-bit data,CBUS 提供 RD# 跟 WR# 訊號
- Synchronous:同上
- CBUS Mode:CBUS0~CBUS3 4-bit GPIO
- 內建 3.3V 電源轉換,最大提供 50mA。
- 驅動程式
FT232RL IO 訊號
| Pin | Name | 預設功能 | Bit Bang | |
|---|---|---|---|---|
| CBUS mode | Asynchronous / Synchronous | |||
| 1 | TXD 輸出 | D0 | ||
| 5 | RXD 輸入 | D1 | ||
| 3 | RTS# 輸出 (Arduino Reset) | D2 | ||
| 11 | CTS# 輸入 | D3 | ||
| 2 | DTR# 輸出 (Arduino Reset) | D4 | ||
| 9 | DSR# 輸入 | D5 | ||
| 10 | DCD# 輸入 | D6 | ||
| 6 | RI# 輸入 | D7 | ||
| 23 | CBUS0 | TXLED# 輸出 | 4-bit GPIO | 其中兩個作為 RD# 及 WR# |
| 22 | CBUS1 | RXLED# 輸出 | ||
| 13 | CBUS2 | TXDEN 輸出,RS-485 用。 | ||
| 14 | CBUS3 | PWREN# 輸出,需外加 10kΩ pull high,USB 設定完 low,USB suspend 時 high。 | ||
| 12 | CBUS4 | SLEEP# 輸出,USB suspend 時 low。 | ||
內部 EEPROM,整理自 datasheet 及 libFTDI。
| parameter | address | value | 說明 |
|---|---|---|---|
| High Current I/Os | 0.2 | 0 | |
| 1 | 0x40 | IN endpoint size | |
| Vendor ID | 3~2 | 0403h | FTDI default VID |
| Product ID | 5~4 | 6001h | FTDI default PID |
| Device Type | 7~6 | 0x0600 | 0x0600=FT232R |
| Battery Powered | 8.4 | 0 | |
| Remote Wake Up | 8.5 | 1 | RI# low → wake up USB Host Controller in 20 ms |
| Bus Powered | 8.6 | 1 | |
| Load VCP Driver | 8.7 | 1 | Make the host to load VCP driver。此位置是猜測的。 |
| Max Bus Power Current | 9 | 90mA | 以 2 mA 為單位 |
| IN endpoint is isochronous | 0x0a.0 | 0 | |
| OUT endpoint is isochronous | 0x0a.1 | 0 | |
| Enable suspend I/O power down | 0x0a.2 | 0 | |
| Use serial number string | 0x0a.3 | 0 | |
| Change USB Version | 0x0a.4 | 0 | |
| Invert TXD | 0x0b | 0 | |
| Invert RXD | 0 | ||
| Invert RTS# | 0 | ||
| Invert CTS# | 0 | ||
| Invert DTR# | 0 | ||
| Invert DSR# | 0 | ||
| Invert DCD# | 0 | ||
| Invert RI# | 0 | ||
| USB Version | 0x0d~0x0c | 0x0200 | USB 2.0 Full Speed |
| Manufacturer Offset | 0x0e.6~0 | 0x18 | 指向 10, 0x03, "FTDI" |
| Manufacturer Enabled | 0xe.7 | 1 | |
| Manufacturer Size | 0x0f | 10 | byte 數含結尾 0,因每個字佔 2 bytes,所以需乘二 |
| Product Description Offset | 0x10.6~0 | 0x24 | 指向 32, 0x03, "FT232R USB UART" |
| Product Description Enabled | 0x10.7 | 1 | |
| Product Description Size | 0x11 | 32 | |
| Serial Number Offset | 0x12.6~0 | 0x46 | 指向 18, 0x03, "A6001dHI",A unique serial number |
| Serial Number Enabled | 0x12.7 | 1 | |
| Serial Number Size | 0x13 | 18 | |
| CBUS0 | 0x14.3~0 | 3 | 0=TXDEN, 1=PWREN#, 2=RXLED#, 3=TXLED#, 4=TXRXLED#, 5=SLEEP#, 6=CLK48, 7=CLK24, 8=CLK12, 9=CLK6, 10=Bitbang IO mode, 11=Bitbang WR#, 12=Bitbang RD# |
| CBUS1 | 0x14.7~4 | 2 | |
| CBUS2 | 0x15.3~0 | 0 | |
| CBUS3 | 0x15.7~4 | 1 | |
| CBUS4 | 0x16.3~0 | 5 | |
| Dynamic Content | 0x18~0x7f | 見說明 | 預設應該是放 Manufacturer, Production Description, 及 Serial 字串。字串含 0,每字佔兩個 byte。格式依序是長度,0x03,字串本身。 10, 0x03, "FTDI" 32, 0x03, "FT232R USB UART" 18, 0x03, "A6001dHI" |
| ChipID | 0x86~0x89 | 見說明 |
USB 的請求控制指令:
- reset (0x00)
- set baud rate (0x01)
- set data (0x02):設定 RS-232 參數
- set flow control (0x03)
- modem control (0x04):設定 DTR, RTS 等。
- poll modem status (0x05)
- set event char (0x06)
- set error char (0x07)
- set latency timer (0x09)
- get latency timer (0x0a)
- set bit mode (0x0b)
- read pins (0x0c)
- read eeprom (0x90)
- write eeprom (0x91)
實際應用
- UART
- 只用 TXD、RXD,或者再加 CTS#, DTR
- RTS# 換成 DTR 作為 Reset 用:SparkFun FTDI Basic Breakout
- FTDI Basic Breakout:除了 TXD/RXD 外,亦提供 CTS# 跟 DTR
- Breakout Board for FT232RL USB to Serial:提供所有 IO 接腳
- Arduino Serial USB Board:RTS 串 0.1 uF 到 Arduino Mini Reset
- SPI (使用 Synchronous BitBang 燒錄 Arduino bootloader)
2012年9月14日 星期五
2012年8月31日 星期五
NXT-G 教育版 2.1 軟體修正
小蘿蔔把 Humanoid 做好,我把示範程式下載來試看看,結果 NXT-G 教育版 2.1 要上載到 NXT 時出現錯誤:
A required file is broken
Error code : 1003但讀取 NXT 狀態是正常的。此後要上載任何程式到 NXT 都會同樣的錯誤,必須把整個 NXT-G 關掉再重新執行,使用其它本來可以的程式才會正常。這個問題需要 NXT EDU: 2.1f3 Patch for Windows 解決,說明檔提到有一項修正剛好就是:
Opening certain programs results in not being able to download any programs, error code 1003NXT EDU: 2.1f3 Patch for Windows 下載回來、解開、執行裡面的 setup.exe 便可修正。
(打開特定程式後無法下載,錯誤代碼 1003)
Linux 用 USB 跟 NXT 通訊
之前在「Linux 用藍牙跟 NXT 通訊的程式」透過藍牙跟 NXT 通,其實最直接是接 USB,一樣使用 NXT Communication Protocol。
網路上就有現成可執行的程式 -- t2n (Talk To NXT),下載,放好 udev 規則讓一般使用者有權限,便可使用:C++,使用 USB
另外列出一些網路上找到的其它程式,不過我沒試就是。
lsusb 輸出:
sudo cat /sys/kernel/debug/usb/devices 輸出:
網路上就有現成可執行的程式 -- t2n (Talk To NXT),下載,放好 udev 規則讓一般使用者有權限,便可使用:C++,使用 USB
wget http://www-verimag.imag.fr/~raymond/edu/lego/t2n/t2n-0.4.tgz開啟 NXT,接上 USB,執行
tar xvf t2n-0.4.tgz
sudo cp t2n-0.4/udev/71-lego.rules /etc/udev/rules.d/
./t2n-0.4/t2n -b -i -ls就可以取到電池電壓、NXT 資訊、檔案列表,如下:
battery level = 7948mV另外還可以上載、下載檔案,執行參數是:
#### NXT INFOS ###############
protocol version=1.124 firmware version=1.28
NXT Name: NXT
Blutooth address: 16:53:17:7f:ffffffcf:00
Blutooth signal: 0
Free user flash: 77180
FILE:"Untitled-1.rxe" SIZE:4768
FILE:"Program.tmp" SIZE:13
FILE:"a.rpg" SIZE:13
FILE:"NVConfig.sys" SIZE:6
FILE:"DemoV2.rxe" SIZE:3996
FILE:"RPGReader.sys" SIZE:5908
FILE:"faceclosed.ric" SIZE:316
FILE:"faceopen.ric" SIZE:316
FILE:"Woops.rso" SIZE:2232
FILE:"! Startup.rso" SIZE:4084
FILE:"! Attention.rso" SIZE:881
FILE:"! Click.rso" SIZE:229
FILE:"Try-Color.rtm" SIZE:4346
FILE:"Try-Touch.rtm" SIZE:1238
FILE:"Try-Light.rtm" SIZE:684
FILE:"Try-Ultrasonic.rtm" SIZE:1208
FILE:"Try-Motor.rtm" SIZE:676
FILE:"Try-Sound.rtm" SIZE:638
FILE:"" SIZE:0
- -put <檔名> : 上載檔案
- -get <檔名> : 下載檔案
另外列出一些網路上找到的其它程式,不過我沒試就是。
- LiNXT:採用 perl 語言
- nxt-python 或 NXT_Python:採用 python,可透過藍牙或 USB 使用。有個用無線鍵盤遙控的 NXT 車 -- The PiBot Raspberry Pi NXT robot ,用 Raspberry Pi 執行 nxt-python 透過 USB 控制 NXT,探奇也有介紹。
順便列一些 NXT USB 資訊
lsusb 輸出:
Bus 003 Device 006: ID 0694:0002 Lego Group Mindstorms NXT
sudo cat /sys/kernel/debug/usb/devices 輸出:
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0694 ProdID=0002 Rev= 0.00
S: SerialNumber=001653177FCF
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
訂閱:
文章 (Atom)
SIP header Via
所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...
-
網路界面驅動程式有兩種接收封包的方式 -- 中斷驅動和 NAPI。傳統是用中斷驅動,在中斷服務程式裡接收封包,但封包量大時會有中斷次數太多而效能變差的問題。NAPI (意思是 New API) 改成中斷服務程式只通知有封包,Kernel 再排程一次接收多個封包來提昇效能。 中...
-
busybox ntpd 是 NTP client,也可作為 NTP server。 參數 -d:Verbose -n:不常駐 -q:(quit) 時間設完後結束 -N:高優先權執行 -w:不設定時間,只是詢問 peers,隱含 -n -l:作為 NTP ser...
-
驅動程式除了 read()/write() 外,通常可以透過 ioctl() 系統呼叫進行一些控制或設定,如鎖門、退片、回報錯誤、改變 baud rate、或 self destruct 等。 在 user space 格式如下: #include <sys/ioctl...


