參考著Samsung的測試程式與u-boot, 把SD driver for prex 移植完畢
目前使用的是處理read/write interrupt的方式完成實做
一開始是採用使用DMA方式實作, 然而碰到無法讀寫完畢
像是read counter會有尚未讀出的資料, 而停留在Rx Active的狀態
今日全部改寫後就可以使用了, 日後會多花時間在blog上撰寫文件與porting過程
日後會實做AC97 driver與 Audio Server
接著就是完成所設定目標的CLI MP3 Player
prex本身有FAT16的支援(之後有打算將fat32移植上去)
以下是開機到把SD Card上名為TEST.TXT的檔案內容印出的過程
Prex Boot Loader V1.00
loading: hdr=01c02008 module=000030e4 name=prex
loading: hdr=01c0a290 module=00003114 name=dev.ko
loading: hdr=01c0e260 module=00003144 name=boot
loading: hdr=01c0fe78 module=00003174 name=proc
loading: hdr=01c12a38 module=000031a4 name=fs
loading: hdr=01c21880 module=000031d4 name=exec
bootdisk base=01c26358 size=000128bc
kernel_entry=00010074
Entering kernel...
Prex version 0.8.1 for arm-at2440ii (Feb 9 2009)
Free pages:
start end size
-------- -------- --------
00000000 - 00010000 64K
00032c00 - 01c26000 28621K
01c39000 - 04000000 36636K
used=140K free=65321K total=65461K
Time slice is 50 msec
IRQ10 attached priority=10
Clock rate: 1000 ticks/sec
Prex driver module built: Feb 9 2009
Calibrating delay loop... ok count=837
Initializing NULL device
Initializing Power Management
pm: Default power policy is performance mode
Initializing Zero device
Initializing Serial Console
UBRDIV0:0x23
MMC check end!!
In SD ready
End id
RCA=0x9ffc
SD Frequency is 33304320Hz
In stand-by
****4bit bus****
SD disk
IRQ21 attached priority=2
Initializing TTY device
Driver initialized
Loading task:'boot'
Loading task:'proc'
Loading task:'fs'
Loading task:'exec'
Starting Bootstrap Server
Starting Process Server
Starting File System Server
Starting Exec Server
boot: Mounting file systems
VFS: Mounting ramfs dev= dir=/
VFS: Mounting devfs dev= dir=/dev
VFS: Mounting arfs dev=/dev/ram0 dir=/boot
VFS: Mounting fifofs dev= dir=/fifo
VFS: Mounting fatfs dev=/dev/card0 dir=/mnt/floppy
boot: Run init process
Prex version 0.8.1 (arm-at2440ii)
[prex:/]# cat /mnt/floppy/TEST.TXT
Hello World !!
[prex:/]#
2009年2月9日 星期一
2009年2月4日 星期三
S3C2440A - Memory Address Space
S3C2440A的Memory Address Space的分佈有兩種模式
基本上兩種模式主要的位置分佈都相同
SDRAM都是分佈在 0x30000000 ~ 0x40000000
不同的僅是 0x0 位置對應的裝置
兩種模式取決於是否使用boot from NAND FLASH
當使用Nand開機時, 0x0 對映的是 4KB 的 SRAM
而不使用Nand開機時, 0x0 對映的是 ROM
(手邊的板子是先前發售的版本, 附有2MB NOR FLASH, 新版本的目前已經不附了, 猜想u-boot是寫入NAND中)
對於S3C2440A惱人的一點就是:
無論如何DRAM的起始位置都固定於 0x30000000
而且沒有提供硬體 remap 的功能
(許多IC具有選擇將ROM or DRAM map 到 0x0 的設定, 方便開機後將ARM環境交給DRAM)
這對於後續要放置的 Exception Vector 比較麻煩
目前沒有特別測試是否SRAM內能否直接放置 Exception Vector
而若寫死後固定放入NOR中, 如此對於之後更新擴充上比較麻煩
不管系統為何都需要遷就放置NOR中寫的處理位置
如此Exception處理速度上變得是需要作兩次branch
對於效率上來說有相當的傷害, 稱不上好的方式
(網路上有人使用這種比較拖泥帶水的作法)
S3C2440A既然使用了ARM920T
具有MMU, 這就是一個漂亮簡單的解法
當使用MMU時, CPU所產生的address皆為 virtual memory address
透過MMU轉換產生physical memory address, 存取適當位置
關於ARM MMU的設定在ARM Architecture Reference Manual 中有詳細的說明
這裡只作簡單說明
ARM MMU Level 1 table 將以1MB 為單位作為對映單位, 管理4GB 定址空間
因此需要 4GB/1MB * 4 = 16KB 空間, 而alignment亦為16KB
每個Entry 有三種選擇可以設定, section, coarse, fine
section: 直接對映連續 1MB 空間 到 指定的位置
coarse: 指定level 2 table所在位置, level 2 中每個位置指定page size為 64KB/4KB 的page table的位置, table 大小為 1KB ((1MB/4KB) * 4 = 1KB), alignment為 1KB (若page size為64KB, 需要重複每個entry 16次)
fine: 在ARM VMSAv6中已經不支援此設定, 與coarse 相似, 但page size為 4KB/1KB, 而level 2 page table 大小為 4KB ((1MB/1KB)*4 = 4KB), alignment 為 4KB (若page size 為 4KB, 每個entry需要重複4次)
MMU的主要用途不用多說, 在OS教科書中都有說明
主要是透過每個中process的page table建構屬於每個process獨立的 virtual memory space
在embedded system中還有一個用法. 就是建立global page table統一管理記憶體, 解決記憶分配造成的fragmentation, 將physical address不連續的page解釋為連續的空間. 亦可以用此方式管理, 以產生physical address連續的空間提供給hardware使用
對於S3C2440A, 最簡單的方法即是建立一個global的level 1 page table, 並且使用section 方式, 將physical address 0x3000000 map到 virtual address 0x0, 即可正常處理各種exception
基本上兩種模式主要的位置分佈都相同
SDRAM都是分佈在 0x30000000 ~ 0x40000000
不同的僅是 0x0 位置對應的裝置
兩種模式取決於是否使用boot from NAND FLASH
當使用Nand開機時, 0x0 對映的是 4KB 的 SRAM
而不使用Nand開機時, 0x0 對映的是 ROM
(手邊的板子是先前發售的版本, 附有2MB NOR FLASH, 新版本的目前已經不附了, 猜想u-boot是寫入NAND中)
對於S3C2440A惱人的一點就是:
無論如何DRAM的起始位置都固定於 0x30000000
而且沒有提供硬體 remap 的功能
(許多IC具有選擇將ROM or DRAM map 到 0x0 的設定, 方便開機後將ARM環境交給DRAM)
這對於後續要放置的 Exception Vector 比較麻煩
目前沒有特別測試是否SRAM內能否直接放置 Exception Vector
而若寫死後固定放入NOR中, 如此對於之後更新擴充上比較麻煩
不管系統為何都需要遷就放置NOR中寫的處理位置
如此Exception處理速度上變得是需要作兩次branch
對於效率上來說有相當的傷害, 稱不上好的方式
(網路上有人使用這種比較拖泥帶水的作法)
S3C2440A既然使用了ARM920T
具有MMU, 這就是一個漂亮簡單的解法
當使用MMU時, CPU所產生的address皆為 virtual memory address
透過MMU轉換產生physical memory address, 存取適當位置
關於ARM MMU的設定在ARM Architecture Reference Manual 中有詳細的說明
這裡只作簡單說明
ARM MMU Level 1 table 將以1MB 為單位作為對映單位, 管理4GB 定址空間
因此需要 4GB/1MB * 4 = 16KB 空間, 而alignment亦為16KB
每個Entry 有三種選擇可以設定, section, coarse, fine
section: 直接對映連續 1MB 空間 到 指定的位置
coarse: 指定level 2 table所在位置, level 2 中每個位置指定page size為 64KB/4KB 的page table的位置, table 大小為 1KB ((1MB/4KB) * 4 = 1KB), alignment為 1KB (若page size為64KB, 需要重複每個entry 16次)
fine: 在ARM VMSAv6中已經不支援此設定, 與coarse 相似, 但page size為 4KB/1KB, 而level 2 page table 大小為 4KB ((1MB/1KB)*4 = 4KB), alignment 為 4KB (若page size 為 4KB, 每個entry需要重複4次)
MMU的主要用途不用多說, 在OS教科書中都有說明
主要是透過每個中process的page table建構屬於每個process獨立的 virtual memory space
在embedded system中還有一個用法. 就是建立global page table統一管理記憶體, 解決記憶分配造成的fragmentation, 將physical address不連續的page解釋為連續的空間. 亦可以用此方式管理, 以產生physical address連續的空間提供給hardware使用
對於S3C2440A, 最簡單的方法即是建立一個global的level 1 page table, 並且使用section 方式, 將physical address 0x3000000 map到 virtual address 0x0, 即可正常處理各種exception
S3C2440A - Clock & Power Controller
原本要撰寫SD Driver for prex, 但是看到test program中SD部份必須清楚知道PCLK
因此先花時間搞清楚S3C2440A關於Clock的設置與目前設定
這裡只列出Programmer 需要注意的地方
S3C2440A 中 Clock Controller 負責產生所需的 clock signals
包含提供給CPU的FCLK, 給AHB週邊的HCLK, 給APB週邊的PCLK
S3C2440A 有兩組PLL, 一組提供FCLK, HCLK, PCLK, 另一組提供給USB(48MHz)
這裡Clock Manager的設定將直接影響到CPU 頻率與後續需要注意PCLK的週邊(Ex:UART, Timer, SD )的設定
手邊的AT2440-II 使用的 oscillator freq = 16.9344 Mhz
輸出頻率取決於 M/P/S divider
Mpll = (2*m*Fin)/(p*(2^s))
m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
文件列出了數種設定組合方便programmer 使用
Output Freq. MDIV PDIV SDIV
47.98 MHz 60(0x3c) 4 2
95.96 MHz 60(0x3c) 4 1
266.72 MHz 118(0x76) 2 2
296.35 MHz 97(0x61) 1 2
399.65 MHz 110(0x6e) 3 1
530.61 MHz 86(0x56) 1 1
533.43 MHz 118(0x76) 1 1
(47.98/95.96 為 48/96近似值, 提供USB使用 (48Mhz) )
而HCLK/PCLK 取決於 CLKDIVN 中的HDIVN 與 PDIVN
HCLK 可為 1, 1/2, 1/3, 1/4, 1/6, 1/8 FCLK
PCLK 可為 1, 1/2 HCLK
UCLK 可為 1, 1/2 UPLL
測試後顯示, 板上的u-boot boot後設定值為 399.65Mhz
(Mpll = (2*(110+8)*16.9344)/((3+2)*2) = 399.65184 Mhz )
此外Clock Controller 提供四種模式
Four Modes
* Normal:
Clock Controller提供CPU, 週邊 clocks
當啟動所有週邊, 功耗將達到最大值
* Slow :
Non-PLL模式, 使用外部clock (XTIpll or EXTCLK)作為FCLK
* Idle :
停止提供FLCK給CPU, 僅提供週邊
* Sleep :
停止內部電源, 除了wake-up 電路, 其他部份皆無電源消耗
因此先花時間搞清楚S3C2440A關於Clock的設置與目前設定
這裡只列出Programmer 需要注意的地方
S3C2440A 中 Clock Controller 負責產生所需的 clock signals
包含提供給CPU的FCLK, 給AHB週邊的HCLK, 給APB週邊的PCLK
S3C2440A 有兩組PLL, 一組提供FCLK, HCLK, PCLK, 另一組提供給USB(48MHz)
這裡Clock Manager的設定將直接影響到CPU 頻率與後續需要注意PCLK的週邊(Ex:UART, Timer, SD )的設定
手邊的AT2440-II 使用的 oscillator freq = 16.9344 Mhz
輸出頻率取決於 M/P/S divider
Mpll = (2*m*Fin)/(p*(2^s))
m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
文件列出了數種設定組合方便programmer 使用
Output Freq. MDIV PDIV SDIV
47.98 MHz 60(0x3c) 4 2
95.96 MHz 60(0x3c) 4 1
266.72 MHz 118(0x76) 2 2
296.35 MHz 97(0x61) 1 2
399.65 MHz 110(0x6e) 3 1
530.61 MHz 86(0x56) 1 1
533.43 MHz 118(0x76) 1 1
(47.98/95.96 為 48/96近似值, 提供USB使用 (48Mhz) )
而HCLK/PCLK 取決於 CLKDIVN 中的HDIVN 與 PDIVN
HCLK 可為 1, 1/2, 1/3, 1/4, 1/6, 1/8 FCLK
PCLK 可為 1, 1/2 HCLK
UCLK 可為 1, 1/2 UPLL
測試後顯示, 板上的u-boot boot後設定值為 399.65Mhz
(Mpll = (2*(110+8)*16.9344)/((3+2)*2) = 399.65184 Mhz )
此外Clock Controller 提供四種模式
Four Modes
* Normal:
Clock Controller提供CPU, 週邊 clocks
當啟動所有週邊, 功耗將達到最大值
* Slow :
Non-PLL模式, 使用外部clock (XTIpll or EXTCLK)作為FCLK
* Idle :
停止提供FLCK給CPU, 僅提供週邊
* Sleep :
停止內部電源, 除了wake-up 電路, 其他部份皆無電源消耗
2009年2月2日 星期一
S3C2440A
瞭解硬體的功能特性對於撰寫移植或是撰寫embedded system是必要的
選擇S3C2440A的原因, 僅只是因為向友人借的EVB使用的是這顆IC
詳細的datasheet可以到此下載
簡單敘述S3C2440A的硬體特性為:
另外建議手邊有著下列書目以便參考使用
選擇S3C2440A的原因, 僅只是因為向友人借的EVB使用的是這顆IC
詳細的datasheet可以到此下載
簡單敘述S3C2440A的硬體特性為:
- ARM920T core
- AC97 codec
- SD interfacce
- RTC
- USB Host/Device controller
- LCD controller
- Uart
另外建議手邊有著下列書目以便參考使用
- ARM Architecture Reference Manual 2/e (ARM官網這裡有免費的第一版)
- ARM System Developer's Guide
- ARM Procedure Call Standard (ARM's Calling Convention)
2009年1月22日 星期四
Plan
由於正處於一段空檔時間, 除了休息外, 也做了一些規劃
當然, 不外乎唸書, 念英文, 為了在專業能力上的精進
所以個人也規劃了兩個個人專案
1. Prex on AT2440-II

Fig: Prex 在 AT2440-II上運作情形
這個專案的目的主要在於期望自己對於軟硬體的系統有更深一層的認識
設立的目標有
在這一週來已經有基本的實做, OS port已經完成, Prex本身已經能夠在板上運作
日後會補足porting過程, Prex/S3C2440的細節介紹
未來是著重於實做與文件的撰寫, 並且完成進一步的目標
2. BeagleBoard
前一陣子取得了Rev.B7的板子
OMAP3530-based的平台, 而且目前已經有相當多的軟體資源
專案目標在於讓自己熟悉幾點
當然, 不外乎唸書, 念英文, 為了在專業能力上的精進
所以個人也規劃了兩個個人專案
1. Prex on AT2440-II

Fig: Prex 在 AT2440-II上運作情形
這個專案的目的主要在於期望自己對於軟硬體的系統有更深一層的認識
設立的目標有
- OS porting
- SD/MMI device driver
- FAT32 file system
- Audio device driver
- MP3 playback
- Memory Management
- Power Management
在這一週來已經有基本的實做, OS port已經完成, Prex本身已經能夠在板上運作
日後會補足porting過程, Prex/S3C2440的細節介紹
未來是著重於實做與文件的撰寫, 並且完成進一步的目標
2. BeagleBoard
前一陣子取得了Rev.B7的板子
OMAP3530-based的平台, 而且目前已經有相當多的軟體資源
專案目標在於讓自己熟悉幾點
- ARM NEON technology
- DSP programming model, ex: TI OpenMax IL implementation
- embedded linux
- Android (System, OpenCore)
訂閱:
文章 (Atom)
在 ARM 平台上使用 Function Multi-Versioning (FMV) - 以使用 Android NDK 為例
Function Multi-Versioning (FMV) 過往的 CPU 發展歷程中, x86 平台由於因應各種應用需求的提出, 而陸陸續續加入了不同的指令集, 此外也可能因為針對市場做等級區隔, 支援的數量與種類也不等. 在 Linux 平台上這些 CPU 資訊可以透過...
-
近日應公司同仁邀請分享對 Halide 做介紹 於是基於 2019 的投影片做一點整理並增加一點常被詢問的資訊
-
這幾年個人在影像處理程式優化的領域打滾, 如果問到感到棘手的工作, floating point 的處理應該可以排上很前面的名次 在許多演算來說由於同時對於 precision 與 dynamic range 的需求, 因此在計算過程中對於浮點數的使用是非常常見的 (若要避免...
-
現今對於 Daily Linux Developer / User 面對不同程式/開發版本環境感到很頭疼, 常常疲於 執行舊版程式需要安裝舊版本 Library, 設定 RPATH / LD_LIBRARY_PATH 開發需求建立不同的版本 SDK 開發/執行環境, 在較舊系統...