星期三, 1月 22, 2014

IEEE 802.11-2012

802.11IEEE 802 系列標準的第 11 部份,規範無線區域網路的 MAC 及 PHY。

版本:
  • 1999 最原始版,2003 reaffirmed
  • 2007 改版,合併 802.11a™-1999、802.11b™-1999、802.11b-1999/Corrigendum 1-2001、802.11d™-2001、802.11g™-2003、802.11h™-2003、802.11i™-2004、802.11j™-2004、及 802.11e™-2005。
  • 2012 目前版本,合併
    • 802.11k™-2008: Radio Resource Measurement of Wireless LANs (Amendment 1)
    • 802.11r™-2008: Fast Basic Service Set (BSS) Transition (Amendment 2)
    • 802.11y™-2008: 3650–3700 MHz Operation in USA (Amendment 3)
    • 802.11w™-2009: Protected Management Frames (Amendment 4)
    • 802.11n™-2009: Enhancements for Higher Throughput (Amendment 5)
    • 802.11p™-2010: Wireless Access in Vehicular Environments (Amendment 6)
    • 802.11z™-2010: Extensions to Direct-Link Setup (DLS) (Amendment 7)
    • 802.11v™-2011: IEEE 802.11 Wireless Network Management (Amendment 8)
    • 802.11u™-2011: Interworking with External Networks (Amendment 9)
    • 802.11s™-2011: Mesh Networking (Amendment 10)

星期二, 1月 14, 2014

socket ioctls

socket 嘛和檔案仝款,有 struct file_operations,ioctl() 系統呼叫時,會執行 sock_ioctl()。[見 Linux /net/socket.c]

long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
其中 file 只用到 file->private_data,其實就是指向 struct socket,然後可取得 socket 其它相關資訊,例如 struct sock、 struct net 等。cmd 是指令編號,定義在 <linux/sockios.h>。argcmd 用的參數,通常指到 user space 的一塊記憶體。

sock_ioctl() 會依據 cmd 設定或讀取 owner/group、bridge、VLAN、DLCI,另外 0x89F? (SIOCDEVPRIVATE) 和 0x8B?? (SIOCIW*) 這兩段是呼叫 dev_ioctl() 交由 device 處理,剩下的呼叫 socket 的 ops->ioctl()。

在 dev_ioctl(),幾乎所有的 cmd 都將 arg 所指的 user space 資料複製到 kernel space 作為 struct ifreq 使用,執行結束後會再複製回 user space,此時 ioctl() 系統呼叫的 arg 所指資料結構需要符合 struct ifreq,才能正確傳遞資訊 [見 Linux /net/core/dev.c,struct ifreq 定義在 <linux/if.h>]。

呼叫 dev_ioctl() 交由 device 處理需要找到特定 device 的資料結構,也就是 struct net_device。struct ifreq 包含 ifr_name,也就是 ifconfig 看到的網路界面名稱,用來找出 struct net_device。程式碼如下:

struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd);
/* 註:以前是 dev->do_ioctl */

預留的 cmd
  • SIOCDEVPRIVATE ~ SIOCDEVPRIVATE+15, 共16 個專門給 device 使用。
  • Wireless 預留 SIOCIWFIRST ~ SIOCIWLAST,共 256 個,定義在 <linux/wireless.h>,包括 SIOCIWFIRSTPRIV ~ SIOCIWLASTPRIV 有 32 個。其中奇數是 GET cmd 才能回傳資料給 user space。處理這些 cmd 的函式,可能是 iw_handler_get_iwstats (SIOCGIWSTATS)、 iw_handler_get_private (SIOCGIWPRIV)、或者來自函式表 dev->ieee80211_ptr->wiphy->wext 或 dev->wireless_handlers ,不然就用 ndo_do_ioctl()。
範例:
  • plip 更改內部 timeout 值。
  • ppp-stats 取得 ppp 驅動程式的資訊。
參考:
  1. LDD3 ch17 
  2. Linux 3.3.8 source codes 
延伸閱讀

星期三, 1月 08, 2014

NXT Interfaces

NXT 的界面有螢幕、按鍵、USB、馬達界面 A/B/C、感應器界面 1/2/3/4、電源、還有無線的藍牙。

螢幕、按鍵就不多談了。電源除了提供電力外,裡面還有一個小開關,告知是接電池還是可充電模組。

USB 2.0
馬達界面亦稱輸出界面,不是 Power Functions 的四條線 (9V, C1, C2, GND),而有六條線 -- M0, M1, GND, 4.3V, T0, T1。
  • M0 跟 M1 類似 Power Functions 的 C1 及 C2,讓馬達正轉、反轉、煞車、或空轉。 
  • T0 跟 T1 -- TACH 訊號,接到 NXT 主處理器
  • MA0 跟 MA1 也可以用來提供 800 mA 電力給其它週邊,免去另外的電源。需注意 A 在煞車時仍供電,B & C 則沒有。

感應器界面亦稱輸入界面,跟馬達一樣是六條線 -- Analog, GND, GND, 4.3V, SCL, SDA
  • 感應器界面跟馬達界面插座相同,訊號也點類似,兩者誤插並不會怎樣,只是不會動作。
  • Analog 是類比輸入,接到 NXT 附屬處理器 ATmega48。
  • SCL 跟 SDA 是 I2C 界面 (9600 bit/s),在 Port 4 還可以作為 1 Mbit/s 的 RS-485 界面 (P-Net)
  • 麵包板接頭
  • Arduino shield with NXT socket -- 讓 Arduino 用 NXT 的感應器
  • RC Sensor for Mindstorms NXT 或 NXT sensor building kid
藍牙:Bluetooth® V2.0 with EDR,支援 Serial Port Profile (SPP)
  • Bluetooth Class II Device (10 公尺),SPP 可視為 Wireless serial port
  • 由接收模式轉換程傳送模式需要 30 ms
  • NXT 主處理器是 ARM7,透過 UART 接到藍牙晶片,用在 stream 模式跟 command 模式,由硬體訊號區別。steam 模式的格式跟 NXT Communication Protocol 是一致的。
    • 藍牙晶片是 CSR BlueCore™ 4 Version 2,內建有 16-bit 處理器,執行藍牙堆疊軟體 -- BlueLab v3.2,並含有 VM 可執行使用者程式。
    • SPI 只用來更新 BlueCore 韌體,跟 NXT 螢幕共用。
  • Linux 用藍牙跟 NXT 通訊的程式 

參考:
  1. NXT 電路圖
  2. What's Inside the NXT Brick
延伸閱讀
  • EV3 吃 NXT 的馬達跟 Sensor,NXT 吃 EV3 的馬達,但不吃 EV3 Sensor
  • http://python-ev3.org/DcmDriver.html -- 有 EV3 硬體界面的說明及偵測方式
  • Support for Mindstorms EV3 stuff
    • Sensor 的 Analog 在 pin 6,Digital 是基於 UART,可能還需要能改變 baud rate。UART 程式參考 EV3 原始碼中的 d_uart_mod.c

星期一, 1月 06, 2014

555 計時器

555 是一顆產生延遲或震盪的 IC,用外部電阻及電容控制延遲或震盪時間。
555 功能方塊圖

接腳:
  1. GND:接地
  2. TRIG (trigger input):觸發輸入
  3. OUT (output):輸出
  4. RESET:重置,強制清掉內部正反器並輸出 low
  5. CONT (control):控制
  6. THRES (threshold input):臨界輸入
  7. DISCH (discharge):放電。跟 OUT 輸出連動,輸出 low 時,啟動放電功能。
  8. VDD:電源,一般 4.5-16V

看功能方塊圖,在電源和接地中間串了三個同款電阻,提供 1/3 和 2/3 電源電壓的參考,分別用來跟 TRIG 接腳跟 THRES 接腳作比較,分別接到內部 Latch 的 S (設為 1) 及 R (清為 0),控制 OUT 輸出和是否放電。
RESETTRIG < 觸發電壓THRES > 臨界電壓OUT
High-Low
Low設 Latch-High
No清 LatchLow
NoNo維持
觸發電壓 (trigger level):大約等於 1/3 電源電壓,可透過控制 (CONT) 接腳改變。
臨界電壓 (threshold level):大約等於 2/3 電源電壓,可透過控制 (CONT) 接腳改變。

應用:單穩態 (monostable) 或 one-shot
low 動作的觸發輸入,產生固定時間的脈衝輸出。臨界輸入跟放電接腳接在一起接 RC 充電電路決定脈衝時間,一開始電容是放電的。觸發輸入一低於觸發電壓,輸出立即 high,電容停止放電改充電,經過 1.1RC 秒充到臨界電壓又回到一開始的清況。

應用:非穩態 (astable) 或多諧振盪器 (multivibrator)
作為振盪器。將 TRIG 跟 THRES 接在一起接 RC 充電電路,DISCH 接 RC 充電電路電阻的分壓 (切成 RA 跟 RB),讓電容在臨界電壓跟觸發電壓之間衝放電。電阻 RA 跟 RB 對電容 C 充電 (此時輸出 High),當超過臨界電壓開始用 RB 放電 (此時輸出 Low),直到低於觸發電壓,如此一直持續下去。電容從 1/3 電源電壓充到 2/3 電源電壓的時間是 -(RA+RB)C(ln(1-1/3)-ln(1-2/3)) = 0.693(RA+RB)C,放電是 0.693(RB)C,所以週期是 0.693(RA+2⋅RB)C,頻率是 1.44/((RA+2⋅RB)C)。

應用:frequency divider (控制 one-shot 發生頻率)
one-shot 電路在充電 1.1RC 秒內的觸發不會有作用。

應用:PWM
在 one-shot 電路,CONT 接訊號,改變臨界電壓來控制脈波寬度。觸發頻率需大於兩倍訊號頻率。

應用:pulse position modulator
在多諧振盪器電路,CONT 接訊號,改變臨界電壓來控制脈波寬度。

應用:linear ramp
類似 one-shot 電路,但 RC 充電電路的電阻改為固定電流來源。

應用:50% duty cycle oscillator
類似多諧振盪器電路,但不同的放電電阻接法,讓 duty cycle 可以 50%。

TLC555 的不同:
  • 使用 CMOS 設計
  • 耗電較少,1 mW @ 5V。LM555 要 15 mW。
  • 較高的輸入阻抗。
  • LM555 的 sink 及 source 能力有 200 mA,TLC555 只有 100 mA 跟 10 mA,但好處是可以減少輸出轉換時的電源電流 spikes,較不需要大的去耦合電容。
  • TLC555 Datasheet提到較精確的 RC 時間算法,不知是否也適用在 LM555。

參考:

  1. LM555 Datasheet
  2. TLC555 Datasheet

星期日, 1月 05, 2014

RC 充電電路

直流電源 V 經過電阻 R 歐姆對電容 C 安培充電。
  • vC: C 的電壓。
  • vR: R 兩端的電壓。

公式:
vR = R⋅i (歐姆定律,單位分別為伏特、歐姆、安培)
電容的電荷量 q = C⋅vC (單位分別為庫倫、法拉、伏特),對時間微分為電流,
i = dq= CdvC
----------
dtdt

算法一:
V = vR + vC = R⋅i + q
---
C
  = R dq+ q
-------
dtC
可解出 q = -CVe-t/RC + CV
vC = q/C = -Ve-t/RC + V = V(1-e-t/RC)

算法二:
V = vR + vC

i = vR=V-vC= CdvC
-----------------
RRdt
可解出 vC = -Ve-t/RC + V = V(1-e-t/RC)


當時間為
  • RC/2 秒時,vC(RC/2) = V(1-e-1/2) = V(1-0.61) = 0.39V。
  • RC 秒時,vC(RC) = V(1-e-1) = V(1-0.37) = 0.63V。如範例,在 RC = 100K Ω ⋅ 1 µF = 0.1 秒的時候,電壓達到約 1V 電源的 0.63 = 0.63V。
  • 1.1 RC 秒時,vC(RC) = V(1-e-1.1) = V(1-0.33) = 0.67V,大約是電源的 2/3。
公式可轉換成時間 t = -RC⋅ln(1-vC/V),除了 RC 外,只跟跟電源電壓的比例有關。

參考:

星期六, 1月 04, 2014

Lubuntu 13.10 autostart

autostart 設定檔是 ~/.config/lxsession/Lubuntu/autostart,每行可放一個指令,於 session 開始時執行 (註:此檔並不是 shell script),「@」開頭表示掛掉會自動重新執行。

~/.config/autostart/ 等 autostart 目錄的 *.desktop 預設沒有作用,需設定「偏好設定」→「Default application for LXSession」(也就是 lxsession-default-apps)→「Autostart」→「Disable autostarted application ?」或編輯 ~/.config/lxsession/Lubuntu/desktop.conf 的 disable_autostart= 為 no 才有作用,但這樣設會造成問題,例如 nm-applet 會執行兩次。

參考:
  1. LXSession
  2. https://lists.ubuntu.com/archives/lubuntu-users/2013-November/006185.html
相關文章:
  1. Lubuntu 13.10 安裝與使用