efuse 是 TI 出廠寫入的,使用者只能讀取,不能更改。efuse 包括 Device ID、Version、唯一的 MAC Address 等。
參考來源:
2014年5月29日 星期四
AM335x 建立開機 SD 卡及開發環境
TI SoC Sitara™ AM335x 的核心是 ARM Cortex™-A8 (ISA ARMv7),其 Starter Kit 型號是 TMDSSK3358,含有 256MB DDR3 SDRAM、4.3" 觸控螢幕、雙 GE、WL1271 Wi-Fi/Bluetooth 模組、XDS100 USB JTAG、,看上面的處理器晶片型號是 XAM3359ZCZ,跑 720 MHz。沒有內建 Flash,備有 SD Card 可以開機試用,使用外接 5V 電源透過 IC TPS65910 管理,需按 POWER 鍵才會開機。
依據 Sitara Linux SDK Getting Started Guide 在 Linux 電腦自製開機 SD Card 及開發環境。
chmod +x ti-sdk-am335x-evm-07.00.00.00-Linux-x86-Install.bin
./ti-sdk-am335x-evm-07.00.00.00-Linux-x86-Install.bin --mode text
預設產生目錄 ~/ti-sdk-am335x-evm-07.00.00.00,到此目錄下
SIZE=`LANG=C fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
再執行 create-sdcard.sh,就可以用 SDK 原本就有的影像檔建立開機 SD 卡。
依據 Sitara Linux SDK Getting Started Guide 在 Linux 電腦自製開機 SD Card 及開發環境。
安裝 SDK
首先要安裝 SDK,但在 Ubuntu 14.04 有些問題,要用文字模式安裝chmod +x ti-sdk-am335x-evm-07.00.00.00-Linux-x86-Install.bin
./ti-sdk-am335x-evm-07.00.00.00-Linux-x86-Install.bin --mode text
預設產生目錄 ~/ti-sdk-am335x-evm-07.00.00.00,到此目錄下
建立開機 SD Card
bin/create-sdcard.sh 用來建立開機 SD Card,由於會解析 fdisk 指令的結果,漢文輸出會造成錯誤,需要將裡面的 fdisk 指令加上 LANG=C 成為SIZE=`LANG=C fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
再執行 create-sdcard.sh,就可以用 SDK 原本就有的影像檔建立開機 SD 卡。
建立 tftp + NFS 開發環境
setup.sh 可用來安裝 tftp、nfs、minicom,並且幫你設定好。setup.sh 會執行 bin 下的命令檔來完成建立,需要做一些修改:- bin/setup-host-check.sh 會檢查 Ubuntu 版本必須為 10.04 or 12.04,需加以修改。
- bin/setup-package-install.sh 會安裝 uboot-mkimage,需改為 u-boot-tools。另外 tftpd可以改為 tftpd-hpa,但 tftpd-hpa 預設的檔案目錄是 /var/lib/tftpboot
- bin/setup-uboot-env.sh 中 media 目錄再加上你的帳號名稱,這是 Ubuntu 14.04 的掛載方式
參考來源
2014年5月27日 星期二
device tree
Device Tree 是描述系統硬體的樹狀資料結構,讓作業系統知道有哪些週邊裝置。原始檔是 device tree source (*.dts),經過 device tree compiler (dtc) 編譯成二進位的 device tree blob (*.dtb),dtb 檔可由 bootloader 載入記憶體後,透過 ARM 處理器的 r2 暫存器傳給 kernel、或直接放到 kernel 的最後面 (使用 CONFIG_ARM_APPENDED_DTB)。
ARM 的 .dts 擋在 arch/arm/boot/dts,可以包含其它 .dtsi 檔後作 overlay (覆蓋)
Device Tree 由 node 組成,node 有名稱 (必要?作用?),可指定位址,可定一個 label 方便 reference。node 內容由 {} 包起來,裡面是其性質 (property)。每個性質是 name = value; 的格式,value 可以是 "字串",多個字串、<數字>、數字陣列、參考其它 node label 等。
透過性質 compatible 可以 binding 到特定 device driver,其它性質提供必要的驅動程式參數。所有 kernel 認得的 binding 說明都在 Documentation/devicetree/bindings/
root node (/) 通常包含有 cpus, memory 等。
參考來源:
延伸閱讀
ARM 的 .dts 擋在 arch/arm/boot/dts,可以包含其它 .dtsi 檔後作 overlay (覆蓋)
Device Tree 由 node 組成,node 有名稱 (必要?作用?),可指定位址,可定一個 label 方便 reference。node 內容由 {} 包起來,裡面是其性質 (property)。每個性質是 name = value; 的格式,value 可以是 "字串",多個字串、<數字>、數字陣列、參考其它 node label 等。
透過性質 compatible 可以 binding 到特定 device driver,其它性質提供必要的驅動程式參數。所有 kernel 認得的 binding 說明都在 Documentation/devicetree/bindings/
root node (/) 通常包含有 cpus, memory 等。
參考來源:
延伸閱讀
- http://elinux.org/Device_Tree
- https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/usage-model.txt
- http://devicetree.org/Device_Tree_Usage
- Device Tree Overlay Support Lands Upstream
2014年5月26日 星期一
SD 腳位
CF (Compact Flash) 因 NOR Flash 而出現,MMC 因 NAND Flash 而出現,後來又發展成 SD (Secure Digital) 卡。
T-Flash → TransFlash → microSD
SD 有 SPI、1-bit、4-bit 三種模式,可用在 SD 記憶體或 SDIO (Secure Digital I/O)。
SD 共有 9 個接腳,斜角為接腳 9,再來為接腳 1 至 8。可以發現接腳 3 跟 4 較為突出,分別是 GND 跟 3V3。
T-Flash → TransFlash → microSD
SD 有 SPI、1-bit、4-bit 三種模式,可用在 SD 記憶體或 SDIO (Secure Digital I/O)。
SD 共有 9 個接腳,斜角為接腳 9,再來為接腳 1 至 8。可以發現接腳 3 跟 4 較為突出,分別是 GND 跟 3V3。
| pin | SPI | 1-bit | 4-bit | 說明 |
|---|---|---|---|---|
| 1 | Card Select | Not Used | Card Detect/Data 3 | |
| 2 | Data Input | Command | ||
| 3 | Ground | |||
| 4 | 2.7~3.6V | |||
| 5 | Clock | |||
| 6 | Ground | |||
| 7 | Data Output | Data | Data 0 | |
| 8 | (Interrupt) | (Interrupt) | Data 1 (Interrupt) | SDIO 才有 Interrupt,SD Memory 沒有 |
| 9 | Not Used | Read Wait | Data 2 or Read Wait | |
SDIO 時,DATA1 可作為 IRQ, DATA2 可作為 Read Wait。microSD 卡只有 8 接腳,少一個 3V3 旁的 GND。MMC 比 SD 薄,可用在 SD 插槽,只有接腳 1 ~ 7,所以沒有 4-bit 模式。
另外在 SD 插槽還有 WP (Write Protection) 及 nCD 訊號。
| SD | SDHC | SDXC | SDUC | ||
|---|---|---|---|---|---|
| 容量 | Min | >2 GB | >32 GB | >2 TB | |
| Max | 2 GB | 32 GB | 2 TB | 128 TB | |
| 典型檔案系統 | FAT12/FAT16 | FAT32 | exFAT | ||
| 速度 | 25MB/s 以下 | 可超過 25MB/s | |||
速度
| 匯流排介面 | 標誌 | 匯流排速度 | 說明 |
|---|---|---|---|
| 預設 | N/A | 12.5MB/s | 1.01 |
| High Speed | 25MB/s | 2.00 | |
| UHS-I | I | 50MB/s (SDR50) | 100MHz 4-bit |
| 104MB/s (SDR104) | 208MHz 4-bit | ||
| 50MB/s (DDR50) | 50MHz 4-bit 升緣+降緣 | ||
| N/A | Lexar 1066x series (160 MB/s) Kingston Canvas Go Plus (170 MB/s) MyMemory PRO (180 MB/s) | 208MHz 4-bit 升緣+降緣 | |
| UHS-II | II | 156MB/s (FD156), 312MB/s (HD312) | 雙排接腳 |
| UHS-III | III | 312MB/s (FD312), 624MB/s (FD624) | 雙排接腳 |
寫入速度看 Speed Class
| Minimum sequential writing speed | Speed Class | 錄影支援 | |||
|---|---|---|---|---|---|
| Suggested max. bitrate | Class | UHS | Video | ||
| 2 MB/s | 15 Mbit/s | C2 | N/A | N/A | SD |
| 4 MB/s | 30 Mbit/s | C4 | HD / Full HD | ||
| 6 MB/s | 45 Mbit/s | C6 | V6 | 4K | |
| 10 MB/s | 75 Mbit/s | C10 | U1 | V10 | |
| 30 MB/s | 220 Mbit/s | U3 | V30 | 8K | |
| 60 MB/s | 460 Mbit/s | V60 | |||
| 90 MB/s | 700 Mbit/s | V90 | |||
實作:
EE335_rev1.pdf《Interfacing SD Cards with Blackfin® Processors》(備份) 在 Blackfin 用 SPI, PPI, PPI + Timer + Tri-State buffers, Asynchronous Memory Interface + buffers 等方式實作 SD 介面,另外還有三種 Card Detection 方式。
參考
- http://en.wikipedia.org/wiki/Secure_Digital
- SD Card驅動程式開發2:SD 卡啟用 SPI 模式:SD 卡收到 CMD0 時,CS 為低電壓。在 CMD0 之前,要發送 >74 個CLK,其中 64 CLK 讓 SD 卡內部供電電壓上升,10 個 CLK 用於 SD 卡同步。SD 卡初始化時,CLK 不能超過 400KHz。
- http://ant.comm.ccu.edu.tw/course/93_Driver/9_Upload/presentation/presentation_694415016.ppt
Lubuntu 圖片列印
Lubuntu 預設的看圖程式是 GPicView,並沒有列印功能。用 Firefox 列印,又會多加了頁首及頁尾,即使設為空白,還是多預留了一些空間。最後我只好安裝 gThumb 解決。
安裝 gThumb 會額外安裝 bison flex gstreamer0.10-gnomevfs gthumb-data gvfs-bin libbison-dev libexiv2-12 libfl-dev libgnomevfs2-0 libgnomevfs2-common libgnomevfs2-extra libwebkit2gtk-3.0-25 m4
安裝 gThumb 會額外安裝 bison flex gstreamer0.10-gnomevfs gthumb-data gvfs-bin libbison-dev libexiv2-12 libfl-dev libgnomevfs2-0 libgnomevfs2-common libgnomevfs2-extra libwebkit2gtk-3.0-25 m4
MBR
MBR (Master Boot Record, 主啟動記錄) 是放在硬碟 (或其它類似裝置) 啟動磁區的啟動程式和分割表 (partition table)。
硬碟由許多磁盤構成,包括
MBR 放第一個磁區 (編號 0),剩下的磁區最多可切出四個區塊,稱為分割區 (partition)。分割區分成主要分割 (Primary Partition) 跟擴充分割 (Extended Partition) 兩種。主要分割就是一個邏輯硬碟。擴充分割的架構就像一個實體硬碟,其第一個磁區放格式類似 MBR 的的 Extend Boot Record (EBR),但只能切出一個邏輯硬碟、以及一個擴充分割。邏輯硬碟以 DOS/Windows 觀點就是 C:、D:、E:... 這些硬碟機名稱。透過擴充分割再切出擴充分割,可分割出一系列邏輯硬碟。
MBR/EBR 內容
磁柱、磁頭、及磁區合稱 CHS (cylinder, head and sector),可用作為磁區定址使用。另一種定址方式稱為 Logical Block Address (LBA),將一顆硬碟的磁區從 0 開始依序編碼。每個分割區需要從分割區描述知道其使用的磁區範圍:
因為 MBR 有最大容量 2.2 TB 的限制等問題,發展了 GPT。
檔案系統識別碼
硬碟由許多磁盤構成,包括
- 磁頭 (Head):硬碟讀寫頭,磁頭數目表示總共有多少磁盤讀寫面。
- 磁軌 (Track):每個磁盤有許多儲存資料的同心圓。
- 磁柱 (Cylinder):同半徑的磁軌所組成的圓柱。
- 磁區 (Sector):硬碟最小儲存單位,一般 512-byte。
MBR 放第一個磁區 (編號 0),剩下的磁區最多可切出四個區塊,稱為分割區 (partition)。分割區分成主要分割 (Primary Partition) 跟擴充分割 (Extended Partition) 兩種。主要分割就是一個邏輯硬碟。擴充分割的架構就像一個實體硬碟,其第一個磁區放格式類似 MBR 的的 Extend Boot Record (EBR),但只能切出一個邏輯硬碟、以及一個擴充分割。邏輯硬碟以 DOS/Windows 觀點就是 C:、D:、E:... 這些硬碟機名稱。透過擴充分割再切出擴充分割,可分割出一系列邏輯硬碟。
MBR/EBR 內容
| 偏移 | byte 數 | 內容 | 說明 |
|---|---|---|---|
| 0 ~ 445 | 446 | 啟動資料與程式 | |
| 446 ~ 509 | 64 | 分割表 | 可描述 4 個分割區,每個用 16 bytes。MBR 可用掉 1~ 4 個描述主要分割,如有剩下可描述 1 個擴充分割。EBR 第 1 個描述一個邏輯硬碟,第 2 個可描述內部的擴充分割,第 3、4 個不能使用。 |
| 510, 511 | 2 | 0xAA55 | 識別用 |
分割區描述
每個分割區描述用 16 bytes,如下:| 偏移位址 | byte 數 | 名稱 | 說明 |
|---|---|---|---|
| 00H | 1 | 啟動狀態 | 80h 表示可啟動 00h 表示不可啟動 |
| 01H | 3 | 起始磁頭、磁柱、及磁區 | 位置為相對於 MBR。其中起始磁頭 8-bit、起始磁柱 10-bit、起始磁區 6-bit。 |
| 04H | 1 | 檔案系統識別碼(partition types) | 識別是擴充分割,還是主要分割所用的檔案系統。 |
| 05H | 3 | 結束磁頭、磁柱、及磁區 | 格式同起始磁頭、磁柱、及磁區 |
| 08H | 4 | 分割區相對位置 | 相對於目前磁區的磁區數。 |
| 0CH | 4 | 磁區數 | 該分割磁區總數 |
磁柱、磁頭、及磁區合稱 CHS (cylinder, head and sector),可用作為磁區定址使用。另一種定址方式稱為 Logical Block Address (LBA),將一顆硬碟的磁區從 0 開始依序編碼。每個分割區需要從分割區描述知道其使用的磁區範圍:
| 定址方式 | CHS | LBA |
|---|---|---|
| 開始磁區 | 起始 CHS | 分割區相對磁區數 |
| 結束磁區 | 結束 CHS | 分割區相對磁區數 + 磁區數 |
| 最大容量 | 8.4 GB = 210*28*(26-1)*512B | 2199 GB = 232*512B |
| BIOS 中斷 | INT 13h | Extended INT 13h (使用 64-bit LBA 定址,可支援達 9400000000 TB 的硬碟,實際上分割表只有 32-bit 的 LBA。) |
檔案系統識別碼
- 06h (CHS)、0Eh (LBA):FAT16
- 0Bh (CHS)、0Ch (LBA):FAT32
- 05h (CHS)、0Fh (LBA):擴充分割
- 07h:NTFS 或 OS/2 HPFS
- 83h:
- 其餘可參閱 Andries Brouwer 所寫的 Partition types
參考
- 小木偶的組合語言教學之Ch 32 硬碟 (1) 分割區
- http://www.48bitlba.com/
- http://ata-atapi.com/
- spfdisk
- Jamyy's《復原 Windows MBR 的各種方式》
2014年5月22日 星期四
Asterisk Internal Database
Asterisk 內部使用的資料庫稱為 AstDB,在 reload 或 restart 時用來保留一些資料,或者使用者也可以用來儲存資料。在 dialplan 有提供 dialplan functions DB、DB_* 等及應用程式 DBdeltree。CLI 也有 database 指令查看。
AMI (內建) 有 DBGet、DBPut、DBDel、DBDelTree
AstDB 的資料以 family 為群組,在 family 中每筆資料 (value) 有唯一的 key。例如 SIP 註冊資訊的 family 是 SIP/Registry,key 為分機名稱,value 為 <addr>:<port>:<expire>:<username>:sip:<contact>:<port>。
一直到 Asterisk 1.8,Asterisk 內部資料庫都是使用 Berkeley DB。Asterisk 10 開始改用 SQLite3。Asterisk 原本就有模組使用 SQLite (SQLite 2) 來儲存 CDR,這裡提到 SQLite2 用字串儲存所有資料,而 SQLite3 用原生的格式儲存數字及 BLOBS,縮小檔案庫大小。
存取 AstDB 的 C 函數
ast_db_put(family, key, value)
ast_db_get(family, key, value, sizeof(value))
ast_db_del(family, key)
參考來源:
AMI (內建) 有 DBGet、DBPut、DBDel、DBDelTree
AstDB 的資料以 family 為群組,在 family 中每筆資料 (value) 有唯一的 key。例如 SIP 註冊資訊的 family 是 SIP/Registry,key 為分機名稱,value 為 <addr>:<port>:<expire>:<username>:sip:<contact>:<port>。
一直到 Asterisk 1.8,Asterisk 內部資料庫都是使用 Berkeley DB。Asterisk 10 開始改用 SQLite3。Asterisk 原本就有模組使用 SQLite (SQLite 2) 來儲存 CDR,這裡提到 SQLite2 用字串儲存所有資料,而 SQLite3 用原生的格式儲存數字及 BLOBS,縮小檔案庫大小。
存取 AstDB 的 C 函數
ast_db_put(family, key, value)
ast_db_get(family, key, value, sizeof(value))
ast_db_del(family, key)
參考來源:
2014年5月10日 星期六
sipp
sipp 是 SIP 效能測試工具程式
sipp 127..0.0.1 ;作為 UAC 撥號
sipp <asterisk IP> -d 20000 ;
測試 OpenWrt 下的 Asterisk 11,大概每秒 8 通以上,就會有撥不通的情況
自己撥給自己測試
sipp -sn uas ;作為 UAS 接受來電sipp 127..0.0.1 ;作為 UAC 撥號
測試 Asterisk
在 /etc/asterisk/extensions.conf 的 [public] 區塊新增 (假設 sip.conf 的 context= 是設成 public)exten => service,1,Answer() ;sipp 預設撥給 service執行 sipp 測試
exten => service,n,Wait(3600) ;等候 60 分鐘,測試時 sipp 會先掛電話
sipp <asterisk IP> -d 20000 ;
測試 OpenWrt 下的 Asterisk 11,大概每秒 8 通以上,就會有撥不通的情況
2014年5月7日 星期三
Asterisk 簡易設定
在 /etc/asterisk/sip.conf 最後面新增
在 /etc/asterisk/extensions.conf 的 [public] 區塊新增 (假設 sip.conf 的 context= 是設成 public)
如果需要很多帳號,sip.conf 可改成新增
後記:SIP 也可以經由 SIP REGISTER 自動產生帳號,只需要 sip.conf 的 [general] 加設 autocreatepeer=yes。
[101] type=peer host=dynamic
在 /etc/asterisk/extensions.conf 的 [public] 區塊新增 (假設 sip.conf 的 context= 是設成 public)
exten => _1XX,1,Dial(SIP/${EXTEN})
如果需要很多帳號,sip.conf 可改成新增
[basic](!) type=peer host=dynamic [101](basic) [102](basic)
後記:SIP 也可以經由 SIP REGISTER 自動產生帳號,只需要 sip.conf 的 [general] 加設 autocreatepeer=yes。
2014年5月1日 星期四
byte order
在電腦,short (16-bit)、long (32-bit)、long long (64-bit) 分別需要 2、4、8 byte 的連續記憶體存放,這時候就有記憶體低位址放高位元組 (big endian),還是放低位元組 (little endian) 的問題,這就是位元組順序 (byte order)。big endian 跟 little endian 名稱由來是一個關於雞蛋哪頭先敲的故事。
x86 處理器就是典型使用 little endian 的處理器,而網路封包欄位通常是高位元組先送收,在記憶體會高位元組先放,所以是 big endian。如果資料的 endian 跟處理器不同,要運算時需要作 endian 轉換。
主機 (host,也就處理器架構) 的 byte order 跟不同 endian 的轉換函數:
網路封包的欄位可以用上述 big endian 轉換的函數,但通常用 ntohs()、htons()、ntohl()、htonl() 函數。
問題:需要 preprocessor macro 嗎?有標準的 macro?
| 0x87654321 放記憶體的情形 | |||||||||
| big endian | little endian | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| 資料 | 0x87 | 0x65 | 0x43 | 0x21 | 0x21 | 0x43 | 0x65 | 0x87 | |
| 位址 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | |
x86 處理器就是典型使用 little endian 的處理器,而網路封包欄位通常是高位元組先送收,在記憶體會高位元組先放,所以是 big endian。如果資料的 endian 跟處理器不同,要運算時需要作 endian 轉換。
主機 (host,也就處理器架構) 的 byte order 跟不同 endian 的轉換函數:
- uint16_t htobe16(uint16_t)
- uint16_t htole16(uint16_t)
- uint16_t be16toh(uint16_t)
- uint16_t le16toh(uint16_t)
網路封包的欄位可以用上述 big endian 轉換的函數,但通常用 ntohs()、htons()、ntohl()、htonl() 函數。
問題:需要 preprocessor macro 嗎?有標準的 macro?
訂閱:
意見 (Atom)
SIP header Via
所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...
-
列出目錄的檔案。 opendir(目錄) 或 fdopendir(fd) 開啟一個 directory stream (DIR),包含此目錄的所有檔案 (含目錄)。readdir(DIR *) 自 directory stream 取得一個檔案,用 struct direct ...
-
-l:輸出 Long Listing 格式,包括下列資訊: 檔案 type and permissions:有 10 個字母,第 1 個字母是 file type: -:一般檔案 b:block device c:character device d:direct...
-
APRS(Automatic Packet Reporting System)字面翻是「自動封包回報系統」,其實是「自動位置回報系統』,是業餘無線電結合全球衛星定位系統 (GPS),以 AFSK AX.25 通訊模式回報給世界各地的 APRS 接收電台,電台再透過網際網路上傳到 ...
