12.30.2006

build cross toolchain from source

ref Nelson's notes ,想不到現在cross build 已經簡化很多了。所以也來試試看。

binutils:
README 中沒有說明configure時可以用的option 有哪些,當然,也沒說明cross-build的方法。
在configure中看到
./configure --help
會列出簡略的build option。
但是沒說--enable, --dieable 可以用的option 有哪些..(大概知道要enable, disable哪些東西的人自然就會 知道吧 :p)。
Nelson's Notes中的
  • --target=arm-elf
  • --prefix=/gnutools
只有兩項。還蠻直觀的..試試:
./configure --prefix=/gnutools --target=arm-elf
很順利,產生Makefile,
之後
make all
install path在/gnutools,所以要是root:
sudo make install
到install path (gnutools) 去看,可以看到binutil 已經裝好了。
接著作gcc...
download gcc-core和g++,unpack (g++會unpack到core中)。
看一下README,再看看FAQ,,需要autoconfig,先安裝autoconf。
grep 一下出現arm的地方..
在INSTALL目錄有比較詳細的安裝說明,是html格式的,從index.html開始看起。
  • --target=arm-elf
  • --with-gnu-as:
    說明系統使用gnu assembler,make process會去尋找build時需要的assembler,如果找到的assembler 不是gnu,卻指定了這個option,會產生conflict。
    同理,如果找到的assembler 是gnu,卻沒有指定這個option,也會有conflict。
    assembler 包含在binutility。
  • --with-gnu-ld
    和--with-gnu-as的意思一樣。說明ld的程式版本。
最後一個section 是有關cross的(終於)。
  • --with-headers=dir
    作cross build時,必須要用這個option 指定target使用的hear files所在的位置。如果 prefix/target/sys-include 目錄不存在的話,build process會將這個option 指定的header修正後,copy到gcc 安裝目錄。
  • --with-libs="dir1 dir2 .... dirN"
    說明target 所用的libary 所在位置,build 過程中會將這些library copy到gcc 安裝位置。
  • --with-newlib
    指定使用newlib。
這一段有點問題,build gcc 需不需要先準備好assembler和library ?
可以參考crosstools的script...

做到這裡,開始懷疑這個步驟和自己的觀念...
先暫停一下..

12.29.2006

USBFN - MDD -PDD

Driver 要export的funciton 有
  • Init
  • -PreDeInit
  • DeInit
  • Open
  • -PreClose
  • Close
  • PowerUp
  • PowerDown
  • IOControl
但是Driver分成MDD, PDD兩部份,MDD是MS寫好的,PDD要vendor自己寫。
MDD和PDD最後會Link啟程成為Dll。
最後Dll name和export function 在PDD的build file中定義 *.def。
因為MDD在上層,是MS為了統一driver interface所寫的,所以export funciton 也通常會是implement在MDD中。

MDD, PDD 雖然是Link在一起,但是溝通並不是直接使用funcion name,
而是透過function table (array)。

在MDD呼叫PDD的Init function時,MDD, PDD 互傳需要的function array。

( 既然PDD_Init都直接call了,為甚麼其他的就要透過function array ?
又不兩個DLL,動態load,沒辦法直接call..)



UfnPdd_Init(
LPCTSTR pszActiveKey,
PVOID pvMddContext,
PUFN_MDD_INTERFACE_INFO pMddInterfaceInfo,
PUFN_PDD_INTERFACE_INFO pPddInterfaceInfo
)
pszActiveKey : 好像是registry Key
pvMddContext : 指向使用Mdd Class ?
pMddInterfaceInfo : 只是一個version string 和一個function pointer - PUFN_MDD_INTERFACE_INFO. Callback funciton.
pPddInterfaceInfo : Init Function 就是要把這個function table 都填好,給Mdd使用。


Ufn_Init 從registry 中取出chip access memory base address, range, isrname, 做好access chip 的準備。
create需要的event, critical section, thread. BusAccessHandle
安裝isr : KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR...)

USB 的Pdd 好像只需要MDD的一個function : Notify。
PDD則要準備好 PUFN_PDD_INTERFACE_INFO 內的20個function,供MDD使用:

MDD呼叫的順序是
  • DllEntry
  • Init
  • IOControl
  • IsConfigurationSupportable
  • IsEndpointSupportable x 3
  • RegisterDevice
  • InitEndpoint
  • IOControl
  • Start
之後就是usb data傳輸動作,在插入PC後才會有.
enumeration process:
  • IssueTransfer
  • SendControlStatusHandshake
  • SetAddress
  • SendControlStatusHandshake
  • IssueTransfer
  • SendControlStatusHandshake
反覆以上"IssueTransfer" - "SendControlStatusHandshake" N次
之後
  • InitialEndpoint
  • ClearEndpointStall
以上重複兩次,
  • IssueTransfer
  • SendControlStatusHandshake
重複兩次,之後,就都是 IssueTransfer..

IsAPIReady - WaitForAPIReady

http://msdn2.microsoft.com/en-us/library/bb202819.aspx

需要知道某service 是否存在(或是已啟動),可以用這兩個API來詢問:
BOOL       IsAPIReady(  DWORD hAPI );
DWORD WaitForAPIReady( DWORD dwAPISlotIndex, DWORD dwTimeout);
從名子就可以知道,一個是polling,一個是Wait Timeout。

WaitForAPIReady 比較好用,但是比較麻煩(? CE 6.0 and above ),IsAPIReady 比較容易用:
argument hAPI 是API 的分類:
  • SH_SHELL : All the Shell Service
  • SH_GDI : All the GDI API
  • SH_WMGR : Window Manager API
用在driver, service比較常用,call 某shell service 前,先確認一下該service 已經啟動(load and start)。

IsAPIReady 宣告在 : WINDEV.H

12.27.2006

download Debian DVD by jigdo

照著 http://www.debian.org/CD/jigdo-cd/ ...
download windows version jigdo . unzip.
將整個folder放到你要的位置,double click jidgo-lite.bat
出現message,問jidgo 檔。
到debian iso download page,選一個jidgo link. 輸入。
http://cdimage.debian.org/debian-cd/current/i386/jigdo-dvd/debian-31r4-i386-binary-1.jigdo
第二片是
http://cdimage.debian.org/debian-cd/current/i386/jigdo-dvd/debian-31r4-i386-binary-2.jigdo
要一片一片作

接著問有沒有上次download過的iso檔,有就輸入。沒就return.

問 debian package site - 去找台灣的mirror ,輸入
http://ftp.tw.debian.org/debian/

開始download template, 接著download iso packge...


會先download template deb, 形成一個4.2G 的DVD iso image (因為我是選dvd)。
然後再download package填入。

使用jigdo 的好處是 下次要download 新版本的DVD iso ,jidgo 會check,只download 不一樣的部份。

README有說明如何設定proxy。
這個用來download testing .比叫核算

http://cdimage.debian.org/cdimage/weekly-builds/i386/jigdo-dvd/

12.26.2006

Device Driver 呼叫另一個Device Driver

這個是 Auron 發現,先說明一般使用方法:

Device Driver Code要使用到另一個Device Driver,和一般Applicaiton 一樣
  • CreateFile( ) 取得要使用的Driver的hadle。
  • DeviceIoControl( ) 對該Driver 進行控制。
  • Device Driver 退出時(unload, deinit...) CloseHandle( )
當然,Create後,使用一般的File Operation (Read, Write, Open..)也可以。

另一種方法(Auron's Way):

利用所有Device Driver都在DEVICE.EXE 的address space的這個特性,各device driver 間的記憶體不經轉換,可以直接呼叫。

所以 另一個作法就是在callie driver 中implement 一個iocontrol,將所有funciton pointer 放在talble中傳遞出來。

這樣同在DEVICE.EXE中的所有driver都可以利用這個 IoControl 取得那個driver 的function pointer,直接呼叫。 (減少不必要的kernel-user space 轉換的overhead)。

為了防止不當呼叫,Callie 的IoControl中該function code implement時,會check..
  if (GetCallerProcess( ) != self->hProc )
Error..
其中self->hProc 會是DEVICE.EXE

Auron 發現這樣的code,雖然是在同一個 process space,但是呼叫時,參數傳遞不可以用local variable (in stack)。否則會發生"access violation"。
所以要呼叫時,傳遞pointer參數一定要指向global variable。

Address Space , Device Driver and DeviceIoControl

提供DeviceIoControl( ) function 的有兩個 EXE : Service.EXE, Device.EXE。
在 devcore.c 和 service. cpp 中 都有這樣的function table :

DevFileApiMethods[] 其中第11個entry 就是 DeviceIoControl。

這個Set API function array 要經由CreateApiSet( )向kernel 註冊,才能成為一個經由"File Handler"呼叫的function。

Kernel 的SC_DeviceIoControl ( ) 會經由 pci->ppfnMethods[11] 呼叫 entry11 - DeviceIoControl。

SC_DeviceIoControl( )是 g_KmodeEntries 中的一個entry。

在CoreDllInit( ) 的DLL_PROCESS_ATTACH時, copy 一份到Coredll的位址空間。
-- 但是找不到 invoke g_KmodeEntries( )的code :(

因為 API entry (wrapper) 的code完全沒有 (例如 DeviceIoControl( ) ),只能找到下一層,所以不知道user program call DeviceIoControl( )後,有沒有切換到其他process (device.exe ? kernel ?) 的位址空間。
所以不知道 各Driver 的Iocontrol Function 是 run 在那一個process 的address space (猜大概是device.exe吧)。

http://blogs.msdn.com/ce_base/archive/2006/02/02/Inside-Windows-CE-API-Calls.aspx
有說明這一段,wrapper implement在coredll中,所有user application link coredll.dll。
coredll 經由 coredll.def 修改 export 出來的function 名稱:
   DeviceIoControl=xxx_DeviceIoControl @179 
所以呼叫DeviceIoControl( )是會呼叫到 xxx_DeviceIoControl ( )。


在oak\inc\pkfunc.h 中可以看到memory model 的constant 宣告:
http://140.114.71.71/WinCE/templates/chapters/chapter10.v1.doc
FIRST_MAPPER_ADDRESS
LAST_MAPPER_ADDRESS 0x7C000000
在這段code的附近可以看到有關"slot", 每個slot 32M (25bit) ,slot 0 reserve 給 running process 和MAX_PROCESS = 32的宣告。

driver, user mode, kernel mode

因為我不知道 CE 5.0 的driver 到底是在user mode還是在kernel mode,還有各個driver 是不是共用一個位址空間。所以..凡而要由 CE 6.0 的文章來看 5.0 的說明:

from : http://blogs.msdn.com/mikehall/archive/2006/09/07/745261.aspx

Windows CE 是 32-bit OS,所以定址能力是 4GB ,從 CE 1.0 到through CE 5.0 高位址 2GB 空間是給 kernel 使用, 低 2GB 則是給..memory mapped files 和切割成很多 32MB 的"slots" 給process - "core o/s" services, 包含device.exe,GWES, file system manager。
With CE 6.0 一些 core o/s services 移到 kernel space :driver manager, GWES, file system manager。
以往 CE 的device driver 都是user mode driver,到了 CE 6.0 你可以選擇是要user mode還是kernel mode.

CE 5.0 所有的driver 都是在 device.exe 中的一個instance, CE 6.0 你可以讓每個 user mode driver 有自己的process。
所以 5.0 中,所有driver 似乎共用一個memory space (pointer 不用轉換 ? ),而且都是在user mode (所以要call virtual - physical 轉換 allocate, transfer 一塊記憶體位址。

其他

Windows 的device driver 只是為了統一API,不是為了保護或管理 hardware resource。

http://www.windowsfordevices.com/articles/AT5839010990.html
Windows 的 driver 只是 DLL. DLLs 被載入 parent process 的位址空間。

parent process 可以呼叫 DLL expose 的funcion .
parent process 用 LoadLibrary( ) or LoadDriver( ) 載入DLL.
LoadDriver 載入 DLL ,同時設定DLL不會被pageout

build Device Driver Dll 和一般Dll 有什麼不同?
Device Driver 最後會被DEVICE.EXE load進入memory。

Dll 可以用DOS Toool : dumpbin 看看exports出來的function 有哪些。


http://blogs.msdn.com/ce_base/archive/2006/02/02/Inside-Windows-CE-API-Calls.aspx
說明 device.exe, service.exe, coredll.exe 也不是在kernel space。而是在所屬的process 自己的space。
device driver 由device.exe load,所以屬於 device.exe 的address space。

READ/WRITE_PORT_USHORT

不知道是不是為了跨平台,driver 對hardware port access (read/write)都用PORT 來作
WRITE_PORT_USHORT(reg, val)
以arm platform 來看,

PUBLIC\COMMON\DDK\INC\ddkmacro.h  
中直接define 為
(*(volatile unsigned short * const)(reg) = (val)
所以就是直接位址寫入。

ddkmacro.h 由ceddk.h include.
ddkmacro.h -- ceddk.h (when define CEDDK_USEDDKMACRO )
driver source (header) include ceddk.h

12.25.2006

On Schedule ..

因為進度落後,所以想出從豎井再開挖

....想出這個辦法的人在工作完成前應該住在豎井底層.....

? 結果還是用鑽炸法完成 ? 那當初決定要用TBM 的人是誰 (顧問公司)?
想花大錢,減少工時,結果反而得到反效果.

12.23.2006

Screen - Terminal (agent)?

screen - 真奇怪,這麼普通的字彙,google 起來第一名竟然是 linux 的terminal agent。
很久以前就看過很多介紹,覺得真是超讚的軟體,尤其在連線環境很差的情況,用ssh 連線常常斷線,每次一段,就要重連,所有都要再來一次。

有screen 就方便了,他幫你開啟一個 shell (?) 讓你操作,幫你保持login,所以即使斷線了,重新連線,再進入剛剛的screen section ,一切都好像沒發生過一樣。

使用方法很簡單,ap-get install screen。
輸入 screen ,就啟動screen ,進入screen。 - 首次進入會有一些message。

第二次進入screen,看起來好像沒什麼改變,但是你目前的操作,都是在screen 之中了。

要記得的命令只有:

在screen 中..

Ctrl-a d : 退出目前的screen (把screen 放到background),回到shell。

在 screen 外 (shell) ,..

看看目前有幾個screen section ..

screen -ls
回到screen ..
 screen -r
要是有很多screen section ..要回到哪一個呢?

有時候,還在screen 中,網路斷了,再連線,用screen -r 恢復失敗,用screen -ls 看,發現screen 那個session 是"Attached"。
所以用
screen -d -r
意思使說。恢復剛剛的session,如果需要的話detach 後再attach..
這樣就OK了。

12.22.2006

USB 1.1 enumeration .. XP's EP0 SETUP sequence

已知OK的裝置,USB1.1看enumeration process:
Request. Value(H). Length(L)
0x06 . 0x01 . 0x40 Get Device Descriptor, Length 0x40
0x05 . 0x00 . 0x00 Set Address
0x06 . 0x01 . 0x12 Get Device Descriptor, (again) with accurate length
0x06 . 0x02 . 0x09 Get Configuration Descriptor, 1st 9 byte section.
0x06 . 0x02 . 0xFF Get Configuration Descriptor, full size
0x06 . 0x03 . 0xFF Get String ID 1
0x06 . 0x03 . 0xFF Get String ID 2
0x06 . 0x03 . 0xFF Get Stirng ID 3
0x06 . 0x03 . 0xFF Get String ID 4
0x06 . 0x03 . 0xFF Get String ID 5
0x06 . 0x01 . 0x12 Get Device Descriptor, (again) with accurate length
0x06 . 0x02 . 0x09 Get Configuration Descriptor, 1st 9 bytes section
0x09 . 0x00 . 0x00 Set Configuration
...
次序不一樣,這個device的device descriptor中, iManufacturer=1, iProduct=2.

USB 2.0 enumeration..

前次USB enumeration process.. 收到. PC 的setup packet sequence..

Request. wValueH(Type)
06. 01 Get Device Descriptor
05. 00 Set Device Address
06. 01 Get Device Descriptor
06. 02 Get Config Descriptor (Length=9 )
06. 02 Get Config Descriptor (Length=0xFF)
..Get Config Descriptor 連續兩次.

若是Device Descriptor 中iSerialNumber 這個欄位不是0的話,在Get Config Descriptor 後會接著Get String ID。

白高興了一下,以為可以從 第二個 Get Configuration Descriptor 的0xFF中跳出...

?

新的防盜版機制:

推出有一堆bug的東西,然後要你認證,如果認證沒過,你就沒辦法修正這些bug。

新的business:

推出有一堆漏洞的東西,再賣給你補洞的工具。

新的?

這個東西我賣給你,但是盒子你可得收藏好,不然哪天我到你家去看,你沒這個盒子,我可以報警抓你。

12.21.2006

GET_DESCRIPTOR - TotalLebngth - XP's behave

在收到 GET_DESCRIPTOR 後,第一次,request length 是 9。剛好是 configuration descriptor 的size。

configuration descriptor 中有一個field 是"Total descriptor length" ,total 就是所有descriptor 的意思,包含這個device 所有的configuration, interface, endpoint。
所以要把這些descriptor 的長度都加起來。

XP 收到9 個byte 的configuration descriptor 後,會知道"totoal descriptor size",於是,會再送出一次相同的 GET_DESCRIPTOR request,但是這次request 的legth 就不只是 9了。

根據"USB complete" 說,XP 會送出你第一次傳給他的configuration descriptor 中total length 的值。

但是我收到的是 0xFF. - 不管我第一次的configuration descriptor 中total length 的值寫的是什麼。

USB 2.0 spec 說 ..(p.253 sec 9.4,3..)
The wLength field specifies the numbers of bytes to return. If the descriptor is longer than the wLength field, only the initial bytes of the descriptor are returned. If the descriptor is shorter than the wLength field, the device indicates the end of the control transfer by sending a short packet when further data is requested. A short packet is defined as a packet shorter than the maximum payload size or a zero length data packet(refer to Chapter 5).

也就是說,XP 第一次要求9 byte,第二次要求0xFF bytes 都是合理的。而且我還真的要follow request bytes length, 第一次只送9 bytes, 第二次送全部的,多的部份送 Null Data.

因為0xFF 這一段跟"USB complete" 說得不一樣,所以google 一下source code..
有一個比較近的.. http://www.google.com/codesearch?hl=zh-TW&q=+USB_DESCRIPTOR_TYPE_CONFIGURATION+show:_S5IVIQqAzc:jVtJyZxm8xs:2mzD8Tn8zNc&sa=N&cd=2&ct=rc&cs_p=http://cq.cx/dl/at91sam7sXXX.zip&cs_f=bootrom/usb.c#a0

 switch(usd.bRequest) {
case USB_REQUEST_GET_DESCRIPTOR:
.....
} else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_CONFIGURATION) {
UsbSendEp0((BYTE *)&ConfigurationDescriptor,
min(sizeof(ConfigurationDescriptor), usd.wLength));
} else if(...
...
..也是一樣。
. 所以是我看錯了 :P

Structure Padding in ARM Compiler (ADS)

USB 的standard configuration descriptor 宣告:
typedef __packed struct CONFIGURATION_DESCRIPTOR
{
char bLength;
char bDescriptorType;
unsigned short wTotalLength;
char bNumInterfaces;
char bConfigurationValue;
char iConfiguration;
char bmAttributes;
char MaxPower;
} CONFIGURATION_DESCRIPTOR;
嗯。size是9 (bytes)。奇數。

在code中,sizeof(this structure) 的話,會顯示 10 - 偶數。

這是因為ARM Compiler (ADS) 自動加上padding 的關係,可以在compiler 選項中enable "warning padding",就可以看到這個structure 出現warning。

如果要compiler 不加上padding 的話,就要將上"__packed " 這個修飾字 (ref DUI0067D_ADS1_2_CompLib.pdf )。

這樣,sizeof( this structure ) 就會是9了。

12.20.2006

Feescale MX31 bootloader Program : HAB Toolkit

MX31 內含一個ROM,boot ROM,裡面的code是Freescake預先寫好的。
boot rom code在boot時會detect boot config pin 的high low狀態,決定boot 的動作:
  1. 執行loader
  2. from NOR flash (8/16 bit)
  3. from NAND Flash (8/16 bit, 256/512 block)
利用rom 的loader 程序,可以用來dowload code/data到RAM。

loader 提供由UART和 USB download 的介面。

Freescale有將loader 的protocol, command open 出來。

Freescale 提供一個too : HAB Toolkit,方便和 rom loader溝通。

rom loader 啟動後,只會initial UART和USB週邊,所以在download之前,要另外下command 設定DDR controller。這部份由init file 提供。

HAB Kit 也提供將RAM DATA燒寫到flash 的功能,這部份是利用MX31的ARM Code執行一段code 來完成,燒寫flash 的command被包裝起來,放在RAM中,
所以當 designer 更換 flash 時,可以follow Freescale 的instruction ,implement 需要的flash command,包裝成bin 後讓HAB Toolkit download到RAM中讓 rom loader 使用。

HAB Toolkit 也可以作download and run 的動作,但是固定jmp 到download 的start address。

HAB toolkit 在download 時,出現 DDR Error的話,可能是 DDR controller設定不良,也可以是target board沒電,或是cable 沒接等問題。

Freescale MX31

FAE
Jim Lin 林良璟
0932023335

12.19.2006

USB 2.0 bus signal. device states on startup.

用示波器量 isp1582 pci 的 3.3 V power,在2440a cpu running時,noise 很大(4V p-p),break時noise 很小(200mV p-p幾乎沒有)。

將code 放到internal SRAM來run 也一樣。

所以把RESET pin 拉到Vcc 應該也無效。

請Ricky 加上粗一點的地線,連接targetboard和demoboard,並且加上大電容。

結果還是一樣。


USB D+/D- Signal Definition:

H.H : Single Ended One - 無效,不應該出現在bus上
H.L : Differential 1
L.H : Differential 0
L.L : Single Ended Zero - End of Packet, Disconnect, Reset。

其中Differential 0, 1被用來定義傳輸資料。
根據speed 不同,Differential 0/1的代表意義也不同。
USB 用J.K 狀態來代表通訊時bus的電壓狀態。
J. K 的定義在Low Speed, Full Speed, High Speed時不一樣。
其中Full Speed, High Speed的J, K定義是一樣的。

Low Speed
J : Differential 0
K : Differential 1

Full/High Speed
J : Differential 1
K : Differential 0

以下對Full/High Speed Bus 描述

BUS Idle : 維持Different 1 (J)

Reset : 當bus處於SingleEndedZero (D+/- both 0) 2.5us 之後,bus 轉換進入 Reset狀態。


USB 2.0 hub 在偵測到某device 是Idle時,就會進行HighSpeed Handshaking 偵測。

  1. Device偵測到VBUS有電壓,將D+接到High,作Softct。
  2. Device 作Softct (D+ high for 3ms?)讓Host偵測到。
  3. Host將bus 維持在SigleEndedZero(2.5us),讓device進入Reset。
  4. Host接著送出一串快速的J.K信號,讓 device 進入HighSpeed。
  5. Host送出Endpoint 0 Setup ,Request Descriptor。
所以device收到interrupt的順序是:
  1. VBUS
  2. BUS RESET
  3. HSpeed State
  4. SETUP0
ref : Book "Usb Complete 3rd edition" Chapter 18 : 信號與編碼。

12.18.2006

ISP1582 data..

DataSheet上說.. 在3.3V Vcc 下..

耗電:
high speed : 60mA
full speed : 25mA

Minimum High Voltage : 0.7V
Maximum Low Voltage : 0.3V

VBUS valid rage : 2.0 ~ 4.0V

Bus Timing :

Minimum WR width : 15ns
Minimim CS_L to WR_L delay : 2 ns
Minimum WR_H to CS_H delay : 0ns
所以CS最小寬度是15+2 = 17ns

也就是說,CS有低於0.3V 的 pulse 維持17ns 以上,就會被可為bus access。

另外RESET pin 腳,minimum pulse = 500us

12.15.2006

ISP 1582/3 debuging..

Mode Register 的PWRON ,描述上雖說是LED pin control,實際上是設定chip always poweron 的bit(reference Unlock register 的說明)。

Isp 1582/3 在一時間 (很短) timeout後 ,就會進入suspend,default setting 在suspend 中,register 只可以read,不能write,所以write 動作都會無效。
若要作write 動作,要先作unlock (write 0xAA37 進入unlock register)。

設定Mode Register的 PWRON,可以讓 ISP1582/3 不要作" timeout 進入suspend" 的動作。

另外,reset 後,chip 需要一段時間才能initialize OK,可以用read chip id 來判斷是否initialize OK。
(但是在未intialize OK前 對chip 作read 動作好像會干擾chip 的動作)

另外一個bit : WKUPCS,是設定對ISP1582/3 的任何動作,都會讓chip 維持wakeup 。
當set時,要持續對chip read/write 才能讓chip alive,否則一下子就進入suspend。

現象: 當設定softct 後,量測D+. D- 只有25ns的 pulse,但是在softct後立即對chip read

USB hardware 相關:

D+. D- pin 很敏感,有時候可以用oscillator 量測,有時候會因此干擾到Pc host 的反應,所以當量測到 D+,D- 有2ms 的pulse 後,就可以確認device 的動作正常,pc host應該要送出setup message。
(如果沒有,就把oscallator 移除,再試一次,正常時,pc 約在 2 sec 內發出 "不認識的usb 裝置" 訊息)。

device 送出2ms的D+ pulse後,host緊接著送出messasge (D+ 不到500mv),約100ms的message。
總共有3個message。
很奇怪的是,第一個message開始的3.3V 2ms pulse確認是device發出的。第二,三個message開頭一樣有3.3V的pulse,不知道是host還是device產生的。
int register state change
  • VBUS, SUSP
  • RESM
  • SUSP
  • RESM
  • BRST
  • HS_STA
  • SOF
  • RESM, SUSP
  • repeat BRST - 2 times
  • SUSP
可以看到BRST 三次: detection of a bus reset。

12.14.2006

About USB. hardware pin

USB 有四個pin : VBUS, GND,D+, D-

D+,D- 平時host 有1.5k 到GND的電阻,所以host detect both 0V。

接上device時,device 要把D+ 加到3.3V (維持2ms ?),host 偵測到這個"Pulse" ?
就會從D+, D- 送出SETUP Command ,

SETUP 的8 bytes data內含request command,

然後是一個IN packet,要求device把descriptor送上來。

如果用oscillator 量D+, D- 的波形,可以看到...
  1. 沒接device時,0V,
  2. 接上device時,會有一個pulse - 放電 的波形 (chip defect ?),
  3. 然後device送出一個2ms 的3.3V pulse。
  4. 然後約1sec以內host 會送出一連串 high-low,然後維持high。等device送出data。
所以...偵測

12.10.2006

在main loop 中 處理:
  • suspend. : receive suspend command, INT。
    處理 : 設mode register,suspend 1-0
  • REQUESTPROC
    處理host送來的request..
  • CONTROLOUTDON
    依照該ENDPOINT狀太,設定endpoint register的stall bit.
  • bulk_out
    處理CBW command
USB Host 的request 可以分為三類:
  • STANDARD
  • CLASS
  • VENDOR

Standard 的request 用一個index來選取以下服務:
沒有implement的就用StallEP0
  • GetStatus
  • ClearFeature
  • StallEP0
  • SetFeature
  • StallEP0
  • SetAddress
  • GetDescriptor
  • StallEP0
  • GetConfiguration
  • SetConfiguration
  • GetInterface
  • SetInterface
  • StallEP0
Class 的request 只有一個
  • Reserved
Vendor 有15個,但是沒有implement,所以都是StallEP0

Request type, and Request index 是在 USB 的SETUP封包中。

SETUP 封包的內容是:
 struct _device_request{
char bmRequestType;
char bRequest;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength;
} DEVICE_REQUEST;
.當USB插入host後,host會送這個OUT Token (封包的一種),給device的ENDPOINT0。

Device

12.08.2006

ISP1582 sample code

PCI Sample code :
  • 先unlockdeive : *(0x7C) = 0xAA37; 由suspend mode喚醒,對任何register 動作前要對 unlock register寫入AA37。
  • testmodereg 寫入0x10 : *(0x84) = 0x10 ; FORCEFS - force Full Speed.
  • mode register, clear SOFTCT (soft-connect) ,也就是將D+ pullup 移除(變成full speed)。
  • 對interrupt register 寫入0xFFFFFF,將所有interrupt source 清除。 *(0x18) = 0xFFFFFFFF.
    interrupt register register 代表目前產生interrupt的原因,對該bit寫入1可以將該source clear。
Register Reading: - debug 才需要
  • 對scratch register寫入0xAA55,讀出確認OK。
  • Interrupt Config (0x10)
  • Interrupt mast L.H (x014, 0x16)
  • Interrupt register L.H (0x18, 0x1A)
  • DMA config (0x38)
  • DMA counter L.H (0x34,0x36)
  • Current Frame Number (0x74)
  • Mode (0x0C)
  • Address (0x00)
Install ISR

Read Chip ID 0x70.74.76

開始connect USB:
 Address Enable : *(0x00) = 0x80;
Mode : *(0x0C) = 0x08 | 0x01 | 0x80 | 0x200; GLINTENA, SOFTCT, CLKAON, 0x200
Test : *(0x84) = 0x00; exit test mode
IntConfig: (0x10) = 0x40 | 0x10 | 0x04; cdbgmod_as,ddbgmodin_a, ddbgmodout_asy,
control interrupt : on ack,stall
in interrupt : ack only
out interrupt : ack and stall
IntEnableLow :*(0x14) = 0x0001 | 0x0008 | 0x0010 | 0x0020 | 0x0100 | 0x0080
0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000 ;
butreset,susp,resume,hs_state,ep0set,
vbus,ep0rx, ep0tx, ep1rx, ep1tx,
ep2rx, ep2tx.
IntEnableHi : *(0x16) = 0x00;


Config Endpoint
先將7個endpoint的tx,rx type 都設為0

12.04.2006

something about NAND Flash

NAND Flash 依照每個cell 所能儲存的位元數,可以分為SLC和MLC兩種。
可以猜到,MLC除了price外,比起SLC來,沒有其他的優點。

但是市場還是以價格導向,所以2006以後,MLC的產品大出現,許多SLC的廠家也將轉換至MLC。

目前MCU直接支援MLC的還是很少(還沒做出來),所以市場對SLC的需求還是大宗。
(迫不得已)

有鑑於此,一些公司就推出使用MMC (SD)介面的MLC,因為直接支援 SLC 的MCU通常也都有SD 介面,所以可以利用這個介面存取MLC,這類MLC+MMC controller的產品,算是過度時期的產品,當MCU將SLC NAND Flash interface改為MLC後,這類產品就失去價值。
但在目前MLC price 約為SLC 50%的現況來說,一些price critica 的大容量需求產品,還是很有新引力。
預測,在大多數供應商將SLC轉為MLC後,SLC的價格將會升高,對比MLC逐漸下降的趨勢,SLC極有可能退出市場。
另外,將多組MLC加上IDE controller後,成為HD的替代品,這類產品也漸漸成熟。
雖然最終不可能達到和HD一樣的價格,但是耗電量,防震,溫度和速度的優勢以足以吸引一定的產品類別。
車用 ?
對於某些需求高速access time的mcu,有一種NOR+NAND type的產品,據說interface是NOR,所以可以符合XIP的需求。同時又具有NAND 大容量,低價格的優點。

12.03.2006

排毒?

食材能夠不煮就不煮,盡量生吃。
到時候吃下一些寄生蟲,在腸子中寄生。
再用灌腸液把他灌出來。

12.02.2006

La Fonera.. Setup OK

真的收到了.. La Fonera.



馬上就照著說明...去註冊,然後...把Fonera 插上 hub...等三個綠燈都亮了...
打開NB,搜尋.....

只有出現MyPlace.. 沒有FON_AP!!
所以follow 說明,連到MyPlace,連是連上了,但是出不去..

大概是我家裏的網路配置太複雜了吧..
我在說明書上有看到,如果沒見到FON_AP,就要設定一下網路...
有空的時候在試試看吧。

update :

設定成功!
和一般 的ap一樣,要自己設定internet連線方式。在我家是用static。
然後重開機就可以。

他還很聰明的知道分成wan,lan,internet三部份。

因為家裏的網路配置很複雜..

所以剛拿到的Fonera接上去後不能直接用。Fonera沒有 ethernet hub ,所以也不能用來替換internet的ipshare+hub。只好放在最末端。

這樣,他就要經過一個AP的轉換,IpShare,才到internet。

由於中間的AP--AP途徑,有些裝置無法取得dhcp 位址。(目前只有Windows系統可以取得)。
所以大部分經過 AP-HUB途徑的裝置都要設定static IP。

Fonera也一樣。
Fonera會broadcast兩個SSID : MyPlace,FON_AP。

MyPlace 這個SSID,就像是一般的AP一樣,是可以自己使用的,private network (說明書上寫是經過encrypt),FON_AP這個SSID,就是給FON 網路的public SSID,會經過FON 管理。要login FON 後才能使用。

所以FON_AP 這個SSID要在Fonera連到internet後,才會出現。
如果你的Fonera沒有出現FON_AP這個SSID,就要check一下Fonera到internet的path是不是OK。

設定Fonera的internet 參數要進入管理頁面。
  1. 連上MyPlace。- 需要S/N作password。
  2. browser : http://192.168.10.1
  3. user/password : admin/admin
  4. status : 可以看看目前的狀態
  5. Advance : internet,可以選dhcp, static,我的例子就要選static,然後設定為家中ipshare的一個client。gateway, dns 都要設對。
  6. 可以設定public, wan, private 間的互通關係。public -- wan default 是deny。很奇怪的是,deny 的話,fonera沒辦法連上internet,要先"allow"一下。
  7. 還有,和一般的ap一樣,設定完static後,要重新開機。
  8. NB重新搜尋AP,就出現FON_AP了。
接著,就可以follow 一般Fonera的設定動作,到Fon 網站註冊你的fonera router type,位置。

完成後,記得回到設定中,把public-- wan 設回deny,否則,以我加的網路設定,經由FON_AP進入的client,可以和家中所有client溝通,很危險的喔。

Fonera很有趣,即使在自己家中要連上FON_AP這個SSID,都要先進入FON login,在FON 網站,自己的管理頁面,還可以看到有那些人利用過你的 router,使用的流量是多少。

還會紀錄你使用過哪些router,當作是你"travel"的紀錄。

還是實際操作比較容易了解FON的作業方式,原來,和一般的Wifi provider一樣,連線進入FON後,都要login,才能到internet,username/password可以到FON註冊。

可以買點數或是買Fonera(變成linus),取得連線的credit。

像我有一台fonera(感謝hemi),並且設定成Linus,所以用我的username/password 可以login任何人的FON_AP。
任何有FON account的人也可以login我的fonera。

真有趣。


若是說有什麼不方便的地方,大概是要在google map上設定自己的位置,很難設,因為住在小地方,google map 解析度沒那麼高,所以很難設定精確。