12.17.2007

放棄當前的code,回到前面的revision..

使用 subversion,將整個folder的內容換掉 (例如..改用另一個vendor的driver)。
發展了一段時間,又要換回以前的內容,繼續開發 (也就是說,放棄這個vendore的driver)。

要用 "revert to revision...."。

revert to revision...N 會把整個folder的內容"改"回 revision N,但是不會改變目前folder的revision number。

就好像是你手動的把folder中的每一個file都改回 revision N的內容了。

所以再check in 時,這些file (revision N)都會被checkin 到最新的 revision。


另一個 "回到以前版本"的方法是 "Update to revision ...N"。
但是這個會讓folder 的內容和revision 都回到 revision N,所以以這個狀態再check in 時,就會有error message,說fild out of date。

...我不知道我這樣作是不是對的..

12.14.2007

Cloudbook - 大眾的eeepc

繼eeepc 後,大眾也要推出一款7" 採用 Linux + google ap,price about $400 的 輕薄型NB "Cloud Book":
  • Via C7 ULV 1.2G
  • 30G HD
  • 1.2MP Cam
  • 7" Lcd screen with touch panel
  • 512MB RAM
  • Wireless
  • 4 in 1 Card Reader
  • 2 USB 2.0 port.
  • gOS (Linux + Google AP)
所以規格比eeePC好喔。而且採用的gOS平台也"比較" Open (我個人的認知啦)。
預計明年 1 月開始發售。

build : "Bad database entry"

Build時出現這個error
BUILD: [00:0000000004:ERRORI] Bad database entry: 複製 -bsp_cfg.h 44 0 1C83BA26E388E00.
把 platform 下的build.dat刪掉後就OK了。

這個error出現的原因是 platform builder 很好心的幫你紀錄每一個foler的檔案內容(不管他有沒有列在 sources 中)。
同時 nmake 有沒有處理檔名中的"空白",所以一旦folder中有檔案(不管有沒有用到)的檔名包含空白,他就會掛掉.....

像上面的error message,就是我有一個file 叫"複製 -bsp_cfg.h"。
而windows中複製一個file到自己的folder,就會自訂在前面加上"複製"和一個space....


所以解決的方法就是找到error 顯示的那個file,刪掉後,開啟release directory, command console。
將 build.* 刪除後,手動下 build -c 重新build一次。

12.13.2007

main trunk

所有的修改最好都要回到main trunk,這樣將來才能用 compare revision 來compare 兩個版本的差異。

所以branch 中的revision 沒辦法和 main trunk 中的revision 作compare。
( 還是我不會 ?)

因為 TortoiseSVN show log 一定是該folder 的repository log。
所以要 switch 到 main trunk ,然後才能show log,然後才能compare 2 revision。
( 還是我不會?)

12.12.2007

sysgen error : regini.ini

Sysgen 出現 regcomp error : regini.ini 並且列出某一行

查是 :
 "FriendlyName"=LOC_USBFN_SERIAL_NAME
把platform.reg 中的這一行刪掉,error 變成 這一行:
"Manufacturer"=LOC_USBFN_SERIAL_MANUFACTURER
所以..大概是 LOC_USBFN_SERIAL_NAME,和 LOC_USBFN_SERIAL_MANUFACTURER 這兩個constant沒有定義吧。

找了一下定義的地方..在 platform\XXXX\Files\ 下的folder : Intltrns 下,有很多subfolder: 040a, 040c... 每個folder都有對應的定義。

猜測是 international 字元支援,每個字元會定義不同的字串內容。

.. 所以把這個folder copy 回去後,error 就消失了。

"Clean" 的解決方法

如果很倒楣的勾選了"Clean before build" ,又按下"sysgen".....
NMAKE:  fatal error U1073: don't know how to make 'C:\WINCE500\public\common\oak\lib\ARMV4I\retail\???.lib'
這(好像)是因為platform builder中 並不是所有的component 都有source code,和 makefile。

但是 又沒有好好"保護" 這些不讓人build 出來的component,所以一旦 "clean" 後就build 不出來了.. Q_Q.

或是說.. 不知道這些component 要到哪裡去build (source 在哪?)。所以無法"重製"。


解決 (不知道這樣算不算是解決):

就是去另一個地方(另一台 有裝 wince 的機器),同樣的path 中,把缺的library copy 回來。
這樣 sysgen 就可以pass 了..

然後 image 也可以boot... run ..

12.11.2007

"Make Run-Time Image" button



修改release folder中的 platform.reg 後,只需要再按這個..

VSS不是這樣用的

上一篇的抱怨..

然後Robert
VSS 不是醬用的,要改之前,要到VSS去checkout,就會自動把readonly 消除。
Loyal 補強說
像你配合 MS 的開發工具,就會自動幫你checkout。
附記: Vincent在旁邊偷偷的笑著...ho ho ho..

12.10.2007

[抱怨] - VSS mark "read only"

用VSS checkout (或checkin後),該file (目錄)會被更動成read-only。

這個配合上 platform builder 的build command,就會出現 "Cannot write 的error"。
然後platformbulder的build有一堆狀況都會朱線這個error message..
有人可能會說...既然是obj file,就不應該加入到version control 中...

但是 CE 可是close source 呀,一堆BSP 的vendor 與都有樣學樣的close source。
所以...有些是以 obj 的方式提供的.
這些close source 的obj 就要放入 version control 了。

如果是剛 install 的BSP也就算了。develope 了一陣的 snapshot,要再加入 version control 中。
誰有時間去一一check obj folder中哪些是vendor supply, 哪些是just build....


然後,就這樣...
難怪會覺得作CE是浪費生命..加上VSS後,更是.....

12.05.2007

CWnd::SetTimer

Wnd 有內建 Timer,可以用SetTimer( ) 這個funcion 來產生定時的event。
Prototype:
UINT_PTR SetTimer(
UINT_PTR nIDEvent,
UINT nElapse,
void (CALLBACK* lpfnTimer
)(HWND,
UINT,
UINT_PTR,
DWORD
)
);
就是..第一個是產生的event,第二是間隔時間,第三是call back function。

event 和 callback function 可以是NULL,代表不是 (但不是同時NULL)。

ref msdn library

12.04.2007

Lcd Controller Timing parameters

Lcd panel 的Timing 最小單位是clock,datasheet中標示為 Clock cycle。
這是panel 的特性,每個panel 有他工作的極限。

像 XXX 的 480x272 type,他的 clock cycle 就標示:
  Typ : 9, Max 15, Unit MHz
所以我們就要適當調整(除頻) host controller 的lcd vclk 頻率,讓他落在這個範圍內。

這個 Clock 信號,配合 R.G.B Data line,每個clock 會write一個pixel 的data到Lcd。



Lcd 掃描是橫式的,以這個例子來看,就是一條 480 的線。 這是一條 horizontal 掃描線。

Lcd 需要另一個信號 HSYNC,用來標示Horizontal 掃描線的開始。
HSYNC信號必須要維持一段時間,讓Lcd controller能夠正確收到。在datasheet中,稱作 Horizontal Sync Pulse Width。
480x272 這個type,標示:
  Min 2, Typ 41 Unit CLK
基於每個 Lcd controller 內部控制器的能力,一旦收到 HSYNC 後,需要一段內部處理時間,才能開始收取horizontal line 的pixel 資料。
這一段時間叫做 Horizontal Back Porch。是以 lcd clock 為單位來計算的。
這也標示在lcd 的data sheet中。
像 480x272這個 type,就標示 Horizontal back porch:
 Min 2, Typ 2, Unit CLK
另外,由於Lcd Controller 實在太糟了,在處理完一條horizontal line的所有pixel後,ㄒ需要休息一段時間,才能再處理下一條。這段時間叫做 Horizontal front porch。
datasheet標示
 Min 2, Typ - Unit CLK
這樣,一條掃描線所需要的參數都定義出來了 (都是以 lcd clock 為單位):

|<--HSPW-->|<--HBP-->|<---HORIZONTAL_LINE_DATA--->|<--HFP-->|


掃描線做完後,接著要靠一條一條的掃描線形成一個畫面(frame)。所以這部份的參數內容,都是以一條掃描線的時間為單位的..

和水平掃描線一樣,每個畫面的開頭,都需要一個信號,告知Lcd "這一條線是frame的開頭",這個信號叫做 Vertical Synch : VSYNC。
在datasheet標示 VSYNC 的信號,必須要維持至少 2 條掃描線的時間: Vertical Pulse Width
 Min 2, Typ 10, Unit H
其中"H"代表一個掃描線所需要的時間。
完全和Horizontal line一樣,Lcd收到VSYNC後,需要一段準備的時間,叫做 vertical back porch。datasheet上寫
 Min 2, Typ 2, Unit H
接下來還是一樣,一個畫面的所有掃描線資料都收完後,Lcd需要休息一段時間,才能再處理下一個Vertical Synch 信號,這段時間叫 Vertical Front Porch。Datasheet上寫:
 Min 2, Typ 2, Unit H
所以Vertical 部份看起來Horizontal 一樣,只是他的reference clock 單位變成"Horizontal Line Time (Period)"

|<--VSPW-->|<--VBP-->|<---EVERY_LINES_IN_FRAME--->|<--VFP-->|


所以 決定 Lcd Clock 頻率後,在決定一條horizontal line 需要的clock 數後,就可以得到 horizontal line 的頻率:
Lcd Clock = 9MHz
HSPW(41)+HBP(2)+H_PIXEL_NUMBER(480)+HFP(2) = 525.
Horizontal Freq = 10MHz/525 = 17.14kHz
然後由vertical 參數算出一個畫面(frame)需要的horizontal line 後,就可以知道frame rate (frame freq:
Horizontal Freq = 17.14kHz
VSPW(10)+VBP(2)+V_LINE_NUMBER(272)+VFP(2) = 286
Frame Rate = 17.14kHz/286 = 59.9 Hz

12.03.2007

usb function driver

修改的部份:
  1. plug-in/out interrupt 由EINT2 改到EINT1
    1. 利用同一pin 腳同時作 interrupt 與 IN/OUT 偵測,所以read 時要re config成input mode。
    2. InitReg 時,要program 好 interrupt pin
    3. BSP中SD 的card detect 用到 EINT1,要改掉,以免影響。
  2. comment out GPH CLKOUT 的相關操作 -- 因為有dedicated crytal。
  3. USB_PHYCTRL - bit 2 應該是 0 (使用 crystal)
這樣之後,就會出現 尋找 usb driver 的prompt了。
修改 platform.reg 中 Serial_Class 的vendor, product id 後就OK了。

Vendor . Product Id changed ?

ActiveSynch 的Vendor Id, Product Id 改了 ?
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Serial_Class]
"FriendlyName"=LOC_USBFN_SERIAL_NAME
; "idVendor"=dword:0547
"idVendor"=dword:045E
"Manufacturer"=LOC_USBFN_SERIAL_MANUFACTURER
; "idProduct"=dword:2720
"idProduct"=dword:00CE
"Product"=LOC_USBFN_SERIAL_PRODUCT
"Index"=dword:5
; "Index"=dword:7

到出現 "尋找usb driver"時,就是 vendorid, product id 錯了.. (和當初安裝driver 的id不同)。

改為 045E, 00CE (就是上面的code)後,就OK了。

11.30.2007

DEBUGMSG FUNCTION_ENTER_MSG.

FUNCTION_ENTER_MSG();
在usbfn.h中..
#define FUNCTION_ENTER_MSG() DEBUGMSG(ZONE_FUNCTION, (_T("%s ++\r\n"), pszFname))
#define FUNCTION_LEAVE_MSG() DEBUGMSG(ZONE_FUNCTION, (_T("%s --\r\n"), pszFname))
ZONE_FUNCTION 又定義在..dbgapi.h
#define DEBUGZONE(n)  (dpCurSettings.ulZoneMask&(0x00000001<<(n)))
這個變數 dpCurSettings ...

11.27.2007

紀錄一下...boot 起來的log

但是也只有boot,不知道有沒有OK..
Enter your selection: u
+TOC_Write
[OK] Write 1 th Block Success
-TOC_Write
System ready!
Preparing for download...
Please send the Image through USB.

Download BIN file information:
-----------------------------------------------------
[0]: Base Address=0x80040000 Length=0x15ef28
[1]: Base Address=0x80200000 Length=0xef97d4
[2]: Base Address=0x81400000 Length=0x528
-----------------------------------------------------
RAM image
rom_offset=0x0.
RAM image
rom_offset=0x0.
RAM image
ROMHDR at Address 80040044h
+WriteOSImageToBootMedia: g_dwTocEntry =1, ImageStart: 0x80040000, ImageLength: 0x15ef28, LaunchAddr:0x800704fc
g_dwMBRSectorNum = 0xa000
Erase Block from 0xa, to 0x3b
Found the Chain region: StartAddress: 0x81400000; Length: 0x528
Writing multi-regions
BINFSPartMaxLength[0]: 0x4000, TtlBINFSPartLength: 0x4000
dwMaxRegionLength[2]: 0x4000
BINFSPartMaxLength[1]: 0x1c0000, TtlBINFSPartLength: 0x1c4000
dwMaxRegionLength[0]: 0x1c0000
BINFSPartMaxLength[2]: 0x1200000, TtlBINFSPartLength: 0x13c4000
dwMaxRegionLength[1]: 0x1200000
dwBlock = 10
OpenPartition: dwStartSector = 0xa000.
OpenPartition: dwNumSectors = 0x15000.
OpenPartition: dwPartType = 0x21.
OpenPartition: fActive = 0x1.
OpenPartition: dwCreationFlags = 0x2.
IsValidMBR: MBR sector = 0xa000
.OpenPartition: Invalid MBR. Formatting flash.
Enter LowLevelFormat [0xa, 0x1e].
BP_LowLevelFormat: // Erase all the flash blocks.
BP_LowLevelFormat: // Erase all the flash blocks.-End
WriteMBR: MBR block = 0xa.
WriteBlock: dwMBRBlockNum = 0xa.
Done.

CreatePartition: Enter CreatePartition for 0x21.
CreatePartition: Start = 0x1000, Num = 0x15000.
WriteMBR: MBR block = 0xa.
WriteBlock: dwMBRBlockNum = 0xa.
nCount = 0
BP_SetDataPointer at 0x1600000
BP_WriteData: Start = 0x1600000, Length = 0x15ef28.
BP_WriteData: dwSectorAddr = 0xb000, dwOffsetSector = 0x0.
BP_WriteData: dwNumSects = 0xaf0
BP_WriteData: dwNumExtraBytes = 0xf28
BP_WriteData: dwSectorAddr = 0xb000
BP_WriteData: dwNumSects = 0xaf0
BP_WriteData: dwSectorAddr = 0xbaf0
BP_WriteData: pbBuffer = 0xac95e000
Updateded TOC!
nCount = 1
BP_SetDataPointer at 0x17c0000
BP_WriteData: Start = 0x17c0000, Length = 0xef97d4.
BP_WriteData: dwSectorAddr = 0xbe00, dwOffsetSector = 0x0.
BP_WriteData: dwNumSects = 0x77c0
BP_WriteData: dwNumExtraBytes = 0x17d4
BP_WriteData: dwSectorAddr = 0xbe00
BP_WriteData: dwNumSects = 0x77c0
BP_WriteData: dwSectorAddr = 0x135c0
BP_WriteData: pbBuffer = 0xad8b8000
nCount = 2
BP_SetDataPointer at 0x29c0000
BP_WriteData: Start = 0x29c0000, Length = 0x528.
BP_WriteData: dwSectorAddr = 0x14e00, dwOffsetSector = 0x0.
BP_WriteData: dwNumSects = 0x0
BP_WriteData: dwNumExtraBytes = 0x528
BP_WriteData: dwSectorAddr = 0x14e00
BP_WriteData: dwNumSects = 0x0
BP_WriteData: dwSectorAddr = 0x14e00
BP_WriteData: pbBuffer = 0xadbc0000
Written Chain Region to the Flash
LoadAddress = 0x81400000; FlashAddress = 0x0; Length = 0x20
memcpy : g_pTOC->chainInfo.dwLoadAddress = 0x81400000; dwRegionStart = 0xADBC0000; dwRegionLength = 0x528
-WriteOSImageToBootMedia
+TOC_Write
[OK] Write 1 th Block Success
-TOC_Write
TOC {
dwSignature: 0x434F544E
BootCfg {
ConfigFlags: 0x2820
BootDelay: 0x5
ImageIndex: 1
IP: 0.0.0.0
MAC Address: 00:00:00:00:00:00
Port: 0.0.0.0
SubnetMask: 255.255.255.0
}
ID[0] {
dwVersion: 0x20004
dwSignature: 0x45424F54
String: 'eboot.nb0'
dwImageType: 0x2
dwTtlSectors: 0x400
dwLoadAddress: 0x8C038000
dwJumpAddress: 0x8C038000
dwStoreOffset: 0x0
sgList[0].dwSector: 0x3000
sgList[0].dwLength: 0x400
}
ID[1] {
dwVersion: 0x1
dwSignature: 0x43465348
String: ''
dwImageType: 0x2
dwTtlSectors: 0xAF8
dwLoadAddress: 0x80040000
dwJumpAddress: 0x800704FC
dwStoreOffset: 0x0
sgList[0].dwSector: 0x0
sgList[0].dwLength: 0xAF8
}
chainInfo.dwLoadAddress: 0X81400000
chainInfo.dwFlashAddress: 0X00000000
chainInfo.dwLength: 0X00000020
}
RAM image
RAM image
Read OS image to BootMedia
ImageLength = 1437696 Byte
Start Page = 2816, End Page = 2991, Page Count = 176
.
Read OS image to BootMedia Success
waitforconnect
INFO: OEMLaunch: Jumping to Physical Address 0x33E704FCh (Virtual Address 0x800704FCh)...


Windows CE Kernel for ARM (Thumb Enabled) Built on Jun 24 2004 at 18:25:00
ProcessorType=0920 Revision=0
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 800707b0
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
FCLK:534000000, HCLK:133500000, PCLK:66750000
Sp=ffffc7cc
[OEMIO:INF] + IOCTL_HAL_POSTINIT
[OEMIO:INF] - IOCTL_HAL_POSTINIT
+OALIoCtlHalInitRTC(...)
+OEMSetRealTime(2005/5/27 12:0:0.000)
-OEMSetRealTime(rc=1)
OEMIoControl: Unsupported Code 0x101008c - device 0x0101 func 35
[HALWP:INF] nCtrlCode = PM_HAL_FIL_INIT
[FIL] ################
[FIL] MID = 0xec
[FIL] DID = 0xd7
[FIL] HID[0] = 0x55
[FIL] HID[1] = 0xb6
[FIL] HID[2] = 0x78
[FIL] ################
[FIL] ##############################
[FIL] FIL Global Information
[FIL] BANKS_TOTAL = 2
[FIL] BLOCKS_PER_BANK = 2048
[FIL] TWO_PLANE_PROGRAM = 1
[FIL] SUPPORT_INTERLEAVING = 1
[FIL] SUBLKS_TOTAL = 2048
[FIL] PAGES_PER_SUBLK = 256
[FIL] PAGES_PER_BANK = 262144
[FIL] SECTORS_PER_PAGE = 8
[FIL] SECTORS_PER_SUPAGE = 16
[FIL] SECTORS_PER_SUBLK = 4096
[FIL] USER_SECTORS_TOTAL = 7598080
[FIL] ADDRESS_CYCLE = 5
[FIL] ##############################

[INFO] WMR_AREA_SIZE = 10
[INFO] SPECIAL_AREA_START = 10
[INFO] SPECIAL_AREA_SIZE = 50
[INFO] VFL_AREA_START = 60
[INFO] VFL_AREA_SIZE = 106
[INFO] VFL_INFO_SECTION_START = 60
[INFO] VFL_INFO_SECTION_SIZE = 4
[INFO] RESERVED_SECTION_START = 64
[INFO] RESERVED_SECTION_SIZE = 102
[INFO] FTL_INFO_SECTION_START = 166
[INFO] FTL_INFO_SECTION_SIZE = 10
[INFO] LOG_SECTION_SIZE = 7
[INFO] FREE_SECTION_START = 176
[INFO] FREE_SECTION_SIZE = 17
[INFO] FREE_LIST_SIZE = 3
[INFO] DATA_SECTION_START = 193
[INFO] DATA_SECTION_SIZE = 1855
[INFO] FTL_AREA_START = 166
[INFO] FTL_AREA_SIZE = 1882
[HALWP:INF] nCtrlCode = PM_HAL_VFL_INIT
[HALWP:INF] nCtrlCode = PM_HAL_VFL_OPEN
[BIBDRV:INF] stNandInfo.dwPagesPerSuBlk = 0x100
[BIBDRV:INF] stNandInfo.dwSectorsPerSuPage = 0x10
[BIBDRV:INF] stNandInfo.dwSpecialAreaSize = 0x32
[BIBDRV:INF] stNandInfo.dwSpecialAreaStart = 0xA
[BIBDRV:INF] MBR MAGIC CODE (First): 0xe9,0xfd,0xff
[BIBDRV:INF] MBR MAGIC CODE (Last) : 0x55,0xaa
[BIBDRV:INF] Part_BootInd = 0x0
[BIBDRV:INF] Part_FirstHead = 0x1
[BIBDRV:INF] Part_FirstSector = 0x1
[BIBDRV:INF] Part_FirstTrack = 0x0
[BIBDRV:INF] Part_FileSystem = 0x21
[BIBDRV:INF] Part_LastHead = 0x15
[BIBDRV:INF] Part_LastSector = 0x0
[BIBDRV:INF] Part_LastTrack = 0x0
[BIBDRV:INF] Part_StartSector = 4096
[BIBDRV:INF] Part_TotalSectors = 86016
BIBDRV_PS:GetProfileName - Profile = SMFlash, length = 16
[BIBDRV:MSG] DSK_IOControl unkonwn code(71c24)
OEMIoControl: Unsupported Code 0x1010104 - device 0x0101 func 65
OEMIoControl: Unsupported Code 0x10100d0 - device 0x0101 func 52
OEMIoControl: Unsupported Code 0x10100f8 - device 0x0101 func 62
Try to open Drivers\Active\02
DevIndex 0
DEBUG: CreateSerialObject 0
Try to open Drivers\Active\03
DevIndex 2
DEBUG: CreateSerialObject 2
Try to open Drivers\Active\04
DevIndex 3

11.22.2007

很糟糕的作法..
#include <..\\..\\kernel\\oal\\debug.c>
所以若是用 function name : OEMInitDebugSerial 來search,
會找到 oal 下的 debug.c,而以為會 link oal libary...
使用close source 的東西真是浪費時間。
尤其是 close source part 既然有使用到 外界定義的global variable (還很多)。
誰知道動了哪一個global variable 會讓那一部份fail 呀。

真是浪費時間

becuase it's C

typedef name "Addr" used in  expression context
這個error..

Addr 是typedef 的structure type。

error 的位置是...
static Addr LBAtoCHS(FlashInfo *pFlashInfo, Addr lba)
{
if(lba.type == CHS)
return lba;

Addr chs;
DWORD tmp = pFlashInfo->dwNumBlocks * pFlashInfo->wSectorsPerBlock;
...

結果...
錯誤的原因是..
這是 C,不是C++,所以所有變數都要先宣告在第一個expression 之前..
不懂為什麼這麼多人要定義 WORD,BYTE,DWORD...
直接用 unsigned short, char, unsigned long 不好嗎?

大家都要用自己的名子 (再加上模組化 做得不好),最後就是..
typedef short SHORT;
typedef long LONG;

typedef signed char INT8;
typedef unsigned char UINT8;
typedef signed short INT16;
typedef unsigned short UINT16;
typedef signed int INT32;
typedef unsigned int UINT32;

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;

typedef unsigned long ULONG;
typedef unsigned short USHORT;
typedef unsigned char UCHAR;

typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;

typedef int INT;
typedef unsigned int UINT;

typedef short Int16;
typedef unsigned short UInt16;
typedef unsigned long UInt32;
typedef unsigned char UInt8;

#define U32 unsigned int
#define U16 unsigned short
#define S32 int
#define S16 short int
#define U8 unsigned char
#define S8 char

typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;
typedef signed int int32;
typedef signed short int16;
typedef signed char int8;
他們沒有想過自己的code,有一天,會要和其他人的code一起工作嗎 ?

讓自己寫的code可以讓很多人方便的使用,不是比較好嗎?
還是自己寫得爽比較重要 ?

11.19.2007

hg 啟動內建的 http server -- part II

繼續..

每個 repository 可以自行設定一些特徵.. web style.. authorization... zip download support ..
就是利用每個 repository 下 .hg 目錄裡的 hgrc 檔 (要自己 create)

以下就是為了方便所寫的 hgrc 內容..
[web]
style = gitweb
allow_archive = bz2 gz zip
push_ssl = false
allow_push = *
這是..
  • 改用 git style 的 wen interface (比較詳細)。
  • 增加 bz2, gz, zip 的source snapshoot 下載
  • 不必用 ssl (因為不知道在windows command 下怎麼用 :P)
  • 允許 經由 http 作push 的動作 (可以讓別人 checkin)

hg 啟動內建的 http server

hg 的內建 webserver。

一般使用:

到已經開啟好 (init完畢)的 repository (例如 c:\writeMLC) 目錄下..
hg serve -p 8002
然後開啟 browser,到address
http://127.0.0.1:8002/
就可以看到那個repository 的資料..

一方面可以作為command line模式的"friendly front end" 替代品。
另一方面,可以跟同事share code。

如果有多個 repository ,就要用 webdir-conf 這個選項。
編輯一個設定檔,指定 web server path 和 repository 得關聯性:
編輯 一個檔案 (我叫 webdirconf)
[paths]
writeMLC = C:\Whimery\DownloadWriteMLC
UseYagarto = C:\Yagarto\UseYagarto
BootRun = C:\BootRun\BootRun_Robert
在啟動 hg serve 時,加上
hg serve -p 8002 --webdir-conf webdirconf
然後在 browser上,就會是..


可以看到..每個repository ...

11.13.2007

11.12.2007

VSS impoter - migrate from VSS to SVN

從 VSS import 到SVN 的工具 : SVNImporter

這是一個用java寫的opensource 的工具,可以將source repository 由 VSS 轉移到 SVN 。

方法好像是 :將package解開,依照需要修改 config.properties。然後下command。

config.properties 裡面的sample 是以 windows 平台為例子的。

... 所以仔細來看,應該也不是真正 import VSS,因為 VSS中各revision 的checkin, out owner 資訊會喪失。

.. 大概是這樣吧,目前還沒正式run.

install java in Debian

sun-java 屬於 "non-free" ,所以要在 sources.list 中加入 "non-free"。

如果只是需要執行環境,就只需要安裝
  • sun-java6-jre
  • sun-java6-plugon
  • sun-java6-fonts
如果要寫java,要加裝
  • sun-java6-jdk
裝完後,command :
$java -version
看java版本。
java不是也GPL了嗎 ? 為甚麼還是在 "non-free" ?

svn http, user-password and access control

使用 http:// 作為svn 的 url,是利用 apache 的 dav_svn module。
dav 是 (distribution authorization and versioning ,是 http 協定的一個擴充)。
AuthUserFile  /etc/apache2/dav_svn.passwd
AuthzSVNAccessFile /etc/apache2/dav_svn.authz
所以
  1. 要先準備好這兩個file,並且 follow .conf 的內容,擺在對應的path 中
  2. user-passwd file 的內容是用 htpasswd 操作的,add user, change password 都要用htpasswd 來作。
  3. svn 下各個 folder 的access 權限就由 dav_svn.authz 設定。 這個file 是plain text。
Add User :
htpasswd  'target .passwd file' user-name
這裡 'target.passwd file' 就是 /etc/apache2/dav_svn.passwd.

權限設定:
[/]
* =
guest = r
svntest = rw
charles-chang = rw
意思是對 [/] 目錄的權限設定:
* - 所有人 - 無法access
guest - 僅能讀取,無法修改
svntest, charles-chang 都是一般user,可以讀取,修改。
當然,要用htpasswd把 guest, svntest, charles-chang都加到 user-passwd file 中
僅能讀取的 user 一樣可以最 checkout,add file.. 但是在 commit 時會出現 error,svn log上也不會有 該user的更動紀錄。

mod-python in apache2

安裝完 libapache2-mod-python 後, 測試一下..

修改 /etc/apache2/httpd.conf 加入下面的部份 (測試完後,再刪掉)
<Location /mpinfo>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler mod_python.testhandler
</Location>
reload apache2 ,或是用 a2enmod mod_python 將module load進來。

然後開啟 browser,網址 : http://10.1.1.152/mpinfo 就可以看到 python module info page。

11.10.2007

folder 方式 access subversion folder

在 svn-book 看到的。
在 Windows XP 中使用 file explorer 瀏覽 WebDAV folder。

據說是 XP 的bug。
在 傳送 authorization 時,為一直用 Host\username,這是不符合 WebDAV規定的,所以會不成功。

所以在 網路芳鄰中新增網路位置時,要 把 port 寫上去..
http://host:80/repository

10.31.2007

UnxUtils : Unix shell tools for Win32

Windows Command Windows 的工具實在太少了,用起來也不習慣。
對於常常切換 windows, linux的人,沒有(或是名子不一樣) less, grep, ls, vi 實在很麻煩。
動不動就要切換window,用mouse 開啟file。

但是光是為了這個原因而裝Cygwin 也顯得太麻煩。

這個 package 就是為了這個而做出來的: UnxUtils

奇怪我找不到安裝說明,所以就把他解開到 C:\UnxUtils\usr\local\wbin ,然後把他加到path 中,就可以用了。

這個package 把source code重新用msvclib link,所以不必用到cygwin 的dll。

裝mercurial的人應該要裝這個

10.26.2007

USB plug-in Interrupt Sequence

以下資料都是參考(Copy)自"USB Made Simple" http://www.usbmadesimple.co.uk 網站內容:


USB又有問題,所以再來複習一下 ISP1582 的 plug-in interrupt sequence...
  1. Get VBUS Interrupt
    1. Reset Controller
    2. Unlock Controller
    3. Set bit "bmSoftCt" == 之後若是pause的話,pc 會出現 "USB 裝置無法辨識"。
    4. Enable Interrupt
  2. 因為reset controller,所以會再出現一次 VBUS Interrupt
    1. Set bit "bmSoftCt"
  3. Get BUSReset "bmIBrst" Interrupt
    1. 設定好 endpoint register (low speed, double buffer, enable)
    2. Enable null address
    3. 啟動 power "bmPwrOn", Clock "bmClkaon"
  4. Get High-Speed Interrupt
    1. 進入high speed,重新設定 endpoint (high speed, double buffer, enable)
  5. Get BUSReset "bmIBrst" Interrupt Again..
  6. Get High-Speed Interrupt Again..
  7. Get EP0Setup Interrupt

在 interrupt handler 中加上 log... interrupt 依次是 (第一次的VBUS不算)
  1. VBUS
  2. Brst (BUSRESET)
  3. HighSpeed
  4. EP0 Setup
  5. Brst (BUSRESET)
  6. HighSpeed
  7. EP0 Setup
  8. ... EP0 Setup...

這一篇 ( USB Made Simple ) 有說明 Device Plug-in 時的電器信號。

Host 看到的D+, D- 狀態:

Detached:
Host 沒有接任何device時。
  • D+ : 0
  • D- : 0
Attached (High, Full Speed device)

  • D+ : 1 -- 這個是Device 拉的,因為device的D+有接1.5k ohms 到 3.3V
  • D- : 0
由於這個狀態就是 device, host 相連後,雙方都沒動作的狀態,所以又叫 idle state

所以拿示波器量測 D+ (device端):
  1. D+, D- 都是GND
  2. D+ 3.3V , D- 0.0 : 這是 controller 送出 SoftCt - 將D+ 拉到High (之後就維持到High)
  3. D+ 3.3 V 維持約100ms 之後 D+ 到 0.0V : 這是 PC送出的 bus reset。
  4. D+ 0.0V 維持約10 ms後(ref)恢復到3.3V : controller 收到 Bus Reset interrupt。
  5. 之後 應該是連續的High/Low (高速交握)...(ref Negotiation High Speed)
USB Made Simple Part 6: High Speed Negotiation 有 一張波形圖:



這裡(討論區) 還有一個中文的有關 USB 啟動信號的說明。
-- 為防止討論區倒閉,我的google notes有一個備份 --

10.25.2007

痞子推薦的麵包店



住在附近的人一定要去喔。

參考這一頁 http://blog.pixnet.net/peace543/post/10149448

Configure VSS for internet access

這是英文的說明 (http://alinconstantin.homeip.net/webdocs/scc/vss_internet.htm)
這一頁(http://linwinfan.cnblogs.com/archive/2006/05/30/412912.html)是中文說明。

VSS Internet plugin 的傳輸效能較 LAN plugin 的效率來得高。適用於低傳輸環境。

Server :
  • ALINC-HOME
  • Internet : http://alinconstantin.dtdns.net
Work:
  • ALINC00
  • Domain : REDMOND

Server 和 Client(Work) 都要裝VSS。
Server
  • 選Custom Install -- Server Components (HTTP Remote Access component)
Client :
  • Default
  • 安裝完後,選 "VSS Internet plugin" 為 active source control provider
  • VSS2005 的user : Tools\Options -- SourceControl/Plug-in -- Option -- Microsoft Visual SourceSafe(Internet)"
  • 若是使用VSS2003 -- ioioioiooiosos


  1. Server : Create database,Open SSAdmin
  2. .....

雖然很多人說VSS對軟體開發不好,但是還是很多人喜歡用的呀....

10.19.2007

USB Signal Voltage

有關 USB 電器信號..


但是2.0 裝置插入時,會先用1.1的電壓,然後進入high-speed chip-chop ,然後reset,然後才用 2.0 的speed (電壓)

10.18.2007

Catch it!

結果是 Port B : 2
一設為High就 system reset.

在 Audio.cpp : SpeakerOn( )

猜測是 power drop.


感謝 multi-ice....

modify some codes..

需求:
  • Class source 加進來就可以用。
source filename 不同,但是class name相同,class interface 相同。

或是..

將interface 獨立宣告出來。各project 衍生出不同的實做。 client code 操作 interface介面。
  • 問題:client code與interface衍生class 的實體發生關聯的方法是 ?
    使用 pointer ? Robert作不喜歡 pointer
原因查出:
  • 因為Robert implement 的 startup code,沒有作ctor section 的初始化,所以不能用 new 運算原。
所以並不是不能用pointer,而是不能用 new..

所以.. 用一個parent class 的 pointer 指向 child class 的實體 object是允許的。
所以.. 所有global object 改用 interface class,在global header file 宣告 interface pointer。然後在 程式啟動時,將實際生成的class 指定給 global interface pointer,讓其他的client code使用。


分析目前code架構,決定修改方法:

在GlobalObjectInit( )中作initialize : 在 CEntry( ) 中 _cpp_initialize( )後就執行,可以確保在任和class operation 之前會作初始化。

就從修改 GlobalObject.h 開始,將global class variable 宣告為 pointer。
CUART  *g_CUART;
CUART3 c_CUART;
c_XX 是實體, g_XX 是interface。
真正的作法是:
static CUART3  c_UART;
CUART *g_CUART = (CUART*)&c_UART;
CUART 是 CUART3 的parent class。
這應該才是Robert 當初設計的目的(?)


從 Mini 開始改起..
  • 還不錯,改了一兩個project後,接下來的project 很好改。
    證明這樣的架構不會引入新的關聯性。
  • 從 Mini 架構 fork 新project 也很容易。
問題:
  • 有些 header file 會區分 是否為 "Mini" project ,而 include 不同的 header,造成在 mini 中要使用完整版的class 出現問題。
  • 上面的例子都是出現在 使用到 class中的static function。

CopyFunction To RAM, Load and Run

上一篇(http://realchecko.blogspot.com/2007/10/loadandrun-overwrite-running-program.html)要宣告 assembly 中的label 的宣告有點不好。
因為是code label,所以還是宣告成 function 比較好 (否則 compiler 會作取值運算)。

總結一下,就是:
extern "C" void CopyAndRun_Start(void);
extern "C" void CopyAndRun_End(void);




memcpy((int*)0x0400,(int*)CopyAndRun_Start,(unsigned int)CopyAndRun_End - (unsigned int)CopyAndRun_Start);

((void(*)(int,int,int))0x00000400)(0x33800000,(int)0x31000000,FileSize ());


這樣就可以了。

10.17.2007

LoadAndRun - Overwrite the running program

要作一個LoadAndRun功能..所以會遇到 Load 到目前program的區域,把自己蓋掉的情況。
所以要先Load到其他地方,copy回來,再run。 這樣,就可以把 "copy" 的動作。 放到其他地方,

要處理的部份,就剩下 "Copy" 的code。

漂亮的話是要用 RAM Function,修改loading script,讓init code把 "Copy" function 放到"其他區域"。

但是 這有點麻煩。--- 因為不確定 memory usage map,不知道要擺在哪好。
所以,想利用 SRAM的區域來放。
目前SRAM放 bootloader code,一旦boot 完,就沒用了。

但是要小心,因為前面的區域,有Exception Hanlder要用,所以要避開。

開啟 make option 的 map output,看一下,就從 main.c 所佔用的區域開使用好了。

main.o 從 0x00000368 開始。 那就從 0x00000400 開使用好了。

SRAM有4k,所以還有3k的space可以用。

原來想把 "CopyAndRun" function 實做在 bootloader中,然後用get function pointer 取得。讓 test code run,但是這樣太不flexible,bootloader改版時,testcode也會受到影響。
所以還是拿來當scratch memory來用好了。

test code把需要的code 填入 這塊區域,然後跳過去run。



CopyAndRun( )要寫到assembly code 中。因為 Run 的Launch 動作本來就是寫在assembly 中。


先寫一個code看一下argument order..

EXPORT CopyAndRun
CopyAndRun
mov pc,lr
然後在 source (*.cpp)中..
extern "C" void CopyAndRun(int a,int b, int c);
..
CopyAndRun(1,2,3);
build , set breakpoint on CopyAndRun 看一下r0,r1,r2的值...
依次是1,2,3,所以argument 的順序是 r0, r1, r2.. 其實這個看ABI 應該可以知道....




實做 copy function...
; void CopyAndRun(DWORD dest, DWORD src,DWORD length)
EXPORT CopyAndRun_Start
EXPORT CopyAndRun_End
CopyAndRun_Start
add r2,r2,r1 ; src+len = end
10 ldr r3,[r1]
str r3,[r0]
add r0,r0,#4
add r1,r1,#4
cmp r1,r2
bne %B10
mov pc,lr
CopyAndRun_End
開頭和最後的label是給copy用的。先作copy的部份,run 只要改最後 的instruction就可以。

這一段code,要被copy到 0x400 的位置,再呼叫。
C function 中,要宣告出 function 的 Start, Stop position ,然後在程式中使用前,用memcpy copy到0x400:
extern void *CopyAndRun_Start;
extern void *CopyAndRun_End;
....
memcpy((int*)0x400,(int*)&CopyAndRun_Start,(int)&CopyAndRun_End - (int)&CopyAndRun_Start);
....
((void(*)(int,int,int))0x0400)(0x500,(int)testdata,20*4);
上面的sample 把 testdata的內容copy到0x500的地方
這樣就可以 check 0x500 的memory內容是否真的和testdata一樣。

確認OK後,就可以改 CopyAndRun 的assembly code。作 Run 的動作..
; void CopyAndRun(DWORD dest, DWORD src,DWORD length)
EXPORT CopyAndRun_Start
EXPORT CopyAndRun_End
CopyAndRun_Start
mov r4,r0 ; save dest address
add r2,r2,r1 ; src+len = end
10 ldr r3,[r1]
str r3,[r0]
add r0,r0,#4
add r1,r1,#4
cmp r1,r2
bne %B10
; mov pc,lr
mov pc,r4 ; jump to dest addr

CopyAndRun_End

10.15.2007

好人的獎賞 ?

在這裡(http://blog.xuite.net/sinner66/blog/13740756)看到的..

大意是說..能夠當一個好人,已經是上帝最好的獎賞了,所以,上帝不需要再給好人其他的獎賞。


所以說,拿到好人卡的,應該就要知足了,別再去煩發卡給你的人 ... :P

10.10.2007

HUB 的選擇

上次買的:hub。

對於一般家用來說,hub實在沒什麼好選的,因為流量也不大,速度要求也不高,照理應該是雖變買一個都OK。

誰知道...



SMC 8 port switch hub.

踩到地雷...

他的特殊外型,不計較,反正hub也不會擺在顯眼的地方。
但是...


AC插座設計在這裡,就有大問題了..
插上AC adaptor 後,就有差不到底的感覺,然後...

Video: stupid design
因為那個圓弧,所以街頭的公差變得很critical :
而我買到的,公差大概大了一點..


雖然家用的hub沒什麼好挑剔,但是稍微一碰到,AC Adaptor就自動跳出來的功能,是絕對不需要的。

還好燦坤很有良心,讓我換了一個,但是我當場試插了一下,結果還是一樣。
所以,他們就很好心的讓我換一個品牌。

這次我不敢隨便拿了,就拿一個最普通的..正正方方,



有了前次經驗,檢查了一下...

嗯,perfect,整個socket頭都有露出在外。
這下就可以很穩固的插上了。

這件事讓我想到一個成語.....多XXX

水杯的考驗

這是我的水杯。
有看到,手柄下端,有一個用繫線帶繞起來的..



是要幹什麼用的呢 ?

阿基米德的繼父

本月買的書:


繼父是宮部美幸宮部美幸的作品,這一本是趣味溫馨走向的推理小說,蠻有趣的。

阿基米德這本應該屬於"科普"類。說明阿基米德的一本手抄本被發現並解開內容的過程,並且於內容得知阿基米德原來遠較我們以往的認知來得偉大得多。

宮部美幸這本,後面的推薦:


有發現什麼嗎? (這句是問同學的)
奇怪...,平常貼這些無聊東西的msn live space竟然不能貼了..
測試一下

上禮拜是Robert的婚禮。



喜帖打開是這樣...


我知道...攝影師很厲害...
看得出來Robert是我們所有同學中最年輕的,.....大概年輕我們10歲..


請客當天...


..Stanley當年(?) 的揮手動作....
還有,當天一整個下午,Robert都維持著這樣的笑容.. :)

10.09.2007

p.60 ..這可不像托運行送錯地址一樣,說聲抱歉就能了事...

newlib : undefined reference to 'end'

使用newlib,因為使用到vsprintf( ),所以 link 的時候出現
In function '_sbrk':
syscalls.c : undefined reference to 'end'
查一下,sbrk( )是syscall 用來作heap memory managemet 的function call,他會需要知道heap region的end address。
所以需要由linker 告知 heap end address (end).

所以修改ldscript,在heap end 處定義 mark 'end' :
 PRIVODE ( end = . ) ; 
但是要注意,要為heap留位置。

loading script中 ' . ' 的意思代表目前ram 的位址。
所以用..
 .  += 1000;
就可以將 目前ram位置向後移動 1000 byte (也就是空出1000 bytes)

small program for ... write program to nandflash

主要功能:讀取SD card的 file ,拆解燒到nandflash 中。
需要的component有:
  • SD card
  • FAT filesystem
  • Nandflash (Write)
  • UART
Steps
  1. Show messasge from UART
  2. Detect SD Card
  3. Read SD Card data
  4. Parse FAT structure
  5. Read File Name, find the File
  6. Read File
  7. Nandflash read sector
  8. Nandflash write sector
Ref : Robert's RoATP Code.

10.05.2007

dynamic_cast

C++ 的dynamic 是要配合RTTI 做的,他可以把class pointer cast 成他的derive class。
如果那個class 本身就是base class 的pointer,不是由derive class pointer cast 過來的,
dynamic_cast 就會 return NULL。

那...他怎麼知道他原來是那一個class pointer ?

所以要RTTI的支援呀!

#include <iostream>
using namespace std;

class A
{
public:
virtual void print() { cout << "A: print" << endl; };
};

class B : public A
{
public:
virtual void print() { cout << "B: print" << endl; };
};

void callprint(A* a)
{
a->print();
B * b = dynamic_cast<B*&t;(a);
if(b)
b->print();
else
cout << " callprint fail " << endl;
}

int main()
{
A* pa = new A;
B* pb = new B;

cout << "now pass A:";
callprint(pa);

cout << "now pass B:";
callprint(pb);

return 0;
}
大意是callprint 會將傳入的point cast 成 child class B。
於是main program 先傳A進去看看他會不會被騙,再傳B進去看看是不是OK.
結果是..
now pass A: A: print
callprint error!
now pass B: B: print
B: print

所以..用dynamic_cast< > 真的可以cast一個base class 到他的derive class喔。

10.04.2007

Orthogonal Function..

?Fourier Transform 的evalution 算法竟然是...
  1. 先假設 該signal = sum(every harmonic wave component)
  2. apply inversion function on both size.
  3. ++ and -- then** and ?? ..
  4. change index with n
  5. done!
其中,利用到 orthogonal 的特性:只有自乘會有值留下,其他相乘都會是 0...


照這樣的推演過程... 不是所有有orthogonal function 都可以用來作為組合的函數....

所以,偉大的應該是找到orthogonal function 的人...

找一下Wiki,看看orthogonal function 有哪些...

http://en.wikipedia.org/wiki/Orthogonal#Examples

log : openocd , download image and run

>load_image  "C:\Y_2443InitDRAM\test.elf" 0x000000
2816 byte written at address 0x000000
download 2816byte in 2s 671875us

>resume 0x000000 <== 這個就是從 0x00000000 開始run的意思
Target 0 resumed

> halt <== 只是需要test.elf的init dram 的code,所以隨時停掉都沒關係
target halted in ARM state due to debug request......

>mdw 0x30000000
0x30000000: 00000000 <== dram 的region 可以access了 :)

>load_image "C:\ATP\Release\ATP_5000.bin" 0x33800000 <= download program 到dram 裡...
146436 byte written at address 0x33800000
downloaded ...

>resume 0x33800000 <== OK,從download的位置開始run...

ADS and GNU AS

arm-elf-as,可以使用類似 C 的 include 語法。

所以將 ads 的assembly 轉成 arm-elf-as:
  • 把所有 GET xxxx 改為 #include "xxx"
  • EQU 改為 =
  • lable 都要加上 ":" 結尾
  • comment 符號 ";" 要改為 "@",或者用 和 C 一樣的 "//" 和 "/* */"
  • local lable 一樣要在"數字"後加":" 代表是label。
    assmbly code 由"%B110" 改為 "110b"
  • DATA, DCD 的section 要改為一般的 label: .word 的方式
  • if, else, 都要改用和 C一樣的#if #else...

Qt/WinCE Preview Release

Qt出WinCE 的版本了。

Qt for Windows CE Technology Preview Download

直接 連過去看比較快,但是還是稍稍摘錄一下:
  • Base on Qt4.3
  • 支援 CE 和 mobile 5.0, 6.0
  • 包含 Qt 4.3 API: QtCore, QtGUI, QtNetwork, QtSQL, QtSVG, QtScript, QtXML and Active Qt模組
  • 同時發佈開發工具 Qt Designer, Qt Linguist and Qt Assistant
  • qtmake 支援 Visual Studio 的vcprj 專案檔
  • Complete Qt/WinCE source code
現在preview 版是以"Preview Licence"發佈,將來一樣會有兩種License : Commerical 和GPL。

download link 在,, http://trolltech.com/developer/download/qt-wince-preview-commercial-4.3.2-vs2005.exe

10.03.2007

openocd + arm-elf-insight

OpenOCD 可以配合 gdb 和圖形介面的 insight 使用。
一樣,由 YAGARTO 下載 arm 的toolchain,安裝。 (eclipse 的安裝也有,但是實際用起來好像沒那麼好用)。

ref HowTo
follow instruction,download一個example 下來當template改比較快。

修改makefile.. 其實只有改 target 和LDSCRIPT
#######################################################################
#
# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!!
#
####################################################################
#
# On command line:
#
# make all = Create project
#
# make clean = Clean project files.
#
# To rebuild project do "make clean" and "make all".
#

###############################################################
# Start of default section
#

TRGT = arm-elf-
CC = $(TRGT)gcc
CP = $(TRGT)objcopy
AS = $(TRGT)gcc -x assembler-with-cpp
BIN = $(CP) -O ihex

MCU = arm920t

# List all default C defines here, like -D_DEBUG=1
DDEFS =

# List all default ASM defines here, like -D_DEBUG=1
DADEFS =

# List all default directories to look for include files here
DINCDIR =

# List the default directory to look for the libraries here
DLIBDIR =

# List all default libraries here
DLIBS =

#
# End of default section
############################################################################

#############################################################################
# Start of user section
#

# Define project name here
PROJECT = test

# Define linker script file here
LDSCRIPT= ./prj/ANS5000_ram.ld

# List all user C define here, like -D_DEBUG=1
UDEFS =

# Define ASM defines here
UADEFS =

# List C source files here
SRC = ./src/main.c

# List ASM source files here
ASRC = ./src/crt.s

# List all user directories here
UINCDIR = ./inc

# List the user directory to look for the libraries here
ULIBDIR =

# List all user libraries here
ULIBS =

# Define optimisation level here
OPT = -O0

#
# End of user defines
################################################################################


INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR))
LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))
DEFS = $(DDEFS) $(UDEFS)
ADEFS = $(DADEFS) $(UADEFS)
OBJS = $(ASRC:.s=.o) $(SRC:.c=.o)
LIBS = $(DLIBS) $(ULIBS)
MCFLAGS = -mcpu=$(MCU)

ASFLAGS = $(MCFLAGS) -g -gdwarf-2 -Wa,-amhls=$(<:.s=.lst) $(ADEFS) CPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -mthumb-interwork -fomit-frame-pointer -Wall -Wstrict-prototypes -fverbose-asm -Wa,-ahlms=$(<:.c=.lst) $(DEFS) LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR) # Generate dependency information CPFLAGS += -MD -MP -MF .dep/$(@F).d # # makefile rules # all: $(OBJS) $(PROJECT).elf $(PROJECT).hex %o : %c $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ %o : %s $(AS) -c $(ASFLAGS) $< -o $@ %elf: $(OBJS) $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ %hex: %elf $(BIN) $< $@ clean: -rm -f $(OBJS) -rm -f $(PROJECT).elf -rm -f $(PROJECT).map -rm -f $(PROJECT).hex -rm -f $(SRC:.c=.c.bak) -rm -f $(SRC:.c=.lst) -rm -f $(ASRC:.s=.s.bak) -rm -f $(ASRC:.s=.lst) -rm -fR .dep # # Include the dependency files, should be the last of the makefile
# -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

# *** EOF ***
然後就是 loading script : ANS5000_ram.ld

就是改 ram 的start address:因為用stepingstone 用的nternal ram,所以起始是0, size只有4k
MEMORY
{
ram : org = 0x0000000, len = 4k
}


然後就是給gdb用的command file : ANS5000_ram.gdb,因為我們的jtag board沒有lay nTRST,所以reset command無效。所以是
target remote localhost:3333
monitor sleep 500
monitor poll
monitor soft_reset_halt
monitor arm7_9 sw_bkpts enable
break main
load
continue
這樣作好後,就可以開啟cmd,下make,把program build 好 (build成test.elf)。
然後 將 openocd啟動起來 (ref 上一篇)。

再follow 上面的 Howto,用修改的cmd file 啟動insight (gdb):
C:\UseYagarto>arm-elf-insight -x .\prj\ANS5000_ram.gdb test.elf
然後就看到

以上都是在windows下做的,因為上次看code發現我們的jtag board layout 和內建的 chameleon 一樣,所以可以用 YAGARTO 的windows binary,只是將config 改為
#daemon configuration
telnet_port 4444
gdb_port 3333

#interface
interface parport
parport_port 0x378
parport_cable chameleon
jtag_speed 8

#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst #srst_pulls_trst

#jtag scan chain
#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
jtag_device 4 0x1 0xf 0xe

#target configuration
daemon_startup attach
#target
target arm920t little reset_run 0 arm920t
#working_area 0 0x200000 0x4000 backup
run_and_halt_time 0 5000
就可以
"hell freezing over or pigs nesting in trees"

Flash Lite Release New version

Vincent的最愛 Flash Lite 推出第三版了 : Flash Lite 3 Delivers Video to Go
然後NTT DoCoMo 和Nokia 都說要使用。

這次的重點是支援FLV格式的播放。

在DrDobb以前的文章已經說明過Flash Lite 1.1,有關Flash 軟體的開發和使用,可以過去看看。


但是,又如何呢?當我們向客戶說明Flash Lite 的單機費用後。
這件事情,就像沒發生過....

10.02.2007

the "N" samples

當作FFT時,每次拿來處理的 N個 sample 的 N 決定的是什麼?

回去翻翻教科書,原來第一句話,就把 N 說得清清楚楚:
Consider a sequence x[n] that is periodic with period N so that x[n] = x[n+rN] for any integer value of r...
這就是Fourier Transform的assumption : 假設目前處理的資料是periodic with itself。

所以,不用考慮其他的部份,N的大小就決定了FFT後所得到的最低頻率(最大週期)。
(或是1/2吧,記得有 Cosine 轉換,是假設這N個sample mirror後再repleat)。



啊 在從這裡繼續下去...

頻域分析就是基於....

  1. 任何 週期波,都可以由他的所有諧波重組而成。
  2. 諧波 : 頻率為整數倍的波。
  3. 其中,倍數是1的諧波,就叫做該信號波的fundamental wave。
所以,頻率是 3kHz 的信號(例如說方波,三角波),可以分解為一連串 3kHz, 6kHz, 9kHz, 12kHz 的sine wave 。
真奇怪,被proxy block了,只能進來編輯,不能access..

Nokia Acquire Navteq

這一篇新聞 Nokia to Acquire Navteq for Cool $8.1B

繼TomTom買下Tele Altas,Nokia 也買下了圖資公司 Navteq,這也是Nokia 在去年買下Gate5這家導航軟體公司後,再次對Location Base Service的相關產業出手。

Nokia說這樣將有助於他們加速在新產品中提供Location Base Service,他們將整合internet information 與geospace information,藉由他們的平台,提供更快速,更準確的地理資訊服務內容給所有的使用者。

最近開始普遍起來的3D導航地圖,好像都是用Navteq的圖資喔。

10.01.2007

eVC: Cannot Add Function

問題: 加入button 後,無法作加入button event handler 的動作,出現"Cannot Add function"的dialog。

Aloha說,這是因為缺了browse data base的關係,嘗試開啟Class Wizard,他會要你產生browse data,選dialog source,產生後,重開eVC就可以了。

9.29.2007

Call DLL Function in class's way

CE 的DLL 有兩種使用方式 (ref : DLL有兩種)
一般使用自動link (ap load 時自動load)比較方便,因為幾乎和一般的library 一樣,沒有限制,所以整個class 可以export 出來,使用起來沒有限制 (不會因為是dll 而有特殊)。

但是另一種手動Load (ap 呼叫 LoadLibrary( )來load dll)就不一樣了。
要使用dll 裡export 的function ,要一一用GetProcAddress(inst,"functioname") 來取出。
所以,得到的是一個address。這樣,要 export 出 class 真是不可能了。(倒是codegguru有一篇hack...,示範怎麼作..)。

但是,還是有方法的。利用 address 的這個特性,將class 轉成pure function table (也就是都是virtual 的function),讓 ap 呼叫就可以了。

方法大概是這樣:

DLL 的部份:
Calc.h (借用那篇hack的code, 但是方法不一樣喔)..
class CCalcPI
{
public:
virtual int Add(int i,int j)=0;
};

class CCalc : public CCalcPI
{
public:
CCalc ();

int Add(int i,int j);
~CCalc();
private:
int use;
};
可以看到那個CCalcPI (Pure Interface)。就是要讓ap 使用的。
dll implement 的部份:
Calc.cpp
#include "stdafx.h"
#include "Calc.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

CCalc* inst=0;

CCalcPI* GetCalc()
{
if(inst==0)
inst = new CCalc();
return inst;
}

CCalc::CCalc()
{
use=0;
}

CCalc::~CCalc()
{
}

int CCalc::Add(int i,int j)
{
use++;
return i+j+use;
}
...順便implement一個singletone.
然後是dll 的def file:
Calc.def
LIBRARY   "Calc"

EXPORTS

GetCalc
ReleaseCalc

SECTIONS
.shared READ WRITE SHARED
export 出來的只有將constructor, destructor包裝起來的C function. (因為是singletone,所以destructor不必傳參數)。

使用:

App 要使用dll 裡的CCalc class,只能由CalcPI介面操作,必且由GetCalc( )取得CCalc class的實體:
    CCalcPI *calcp;
HINSTANCE hInst;
hInst = LoadLibrary(L"\\Windows\\Calc.dll");
if(hInst){

typedef CCalcPI* getcalc(void);

getcalc* fgetc= (getcalc*)GetProcAddress(hInst,L"GetCalc");
if(fgetc){
calcp = (*fgetc)();
int r = calcp->Add(1,2);

CString outstr;
outstr.Format(L"%d",r);
MessageBox(outstr);

CCalcPI* cp2=(*fgetc)(); // 看看singletone有沒有效 : by "use" variable
r=cp2->Add(1,2);
outstr.Format(L"%d",r);
MessageBox(outstr);
}
}

很奇怪,如果不是pure virtual class (CCalcPI),而是直接使用CCalc 的話,Linker會complain Add( ) function 找不到。

這一招其實是客戶教的....但是他的sample code把export function 直接放到class中,我不知道要怎麼作..

這一篇有類似的方法(好像更漂亮),但是我照作 link 還是有error。

9.27.2007

Linux Tiny : for small footprint

KernelTrap 上的文章

最近2.6 的kernel 越來越朝向大系統邁進,footprint越來越大,mips越用越兇。
越來越不適合embedded system和古老的(e.g 386) 機器。

所以有有人針對embedd system 和古老的機器,寫了一些patch,並且蒐集一些相關的patch,放在Linux Tiny 這個專案中。方便其他有需要的人。

偉大的Andrew Morton建議把patch都寄給他,他會把他放到他的-mm tree中。(真好)。

這個 elinux.org 有很多有用(趣)的文章喔,像這個 Kernel Size Tunning Guide ,就有詳細的 縮小footprint 的說明喔。

9.20.2007

OpenOCD , test run

OpenOCD 是一個很像以前 armtools 的專案,是利用jtag 控制arm core,而不是像samsung 的sjf 一樣,利用chip pinout boundary chain,控制pin out。

所以 OpenOCD 可以適用於所有使用arm core 的chip (而 sjf 只能用在samsung S3C24xx上)。

install:

follow 這一頁(http://openfacts.berlios.de/index-en.phtml?title=Building_OpenOCD)的說明,checkout openocd source。
因為公司有proxy,所以要用下面的command:
:~$svn co https://svn.berlios.de/svnroot/repos/openocd/trunk
然後到trunk 下。
:~$./bootstrap
這個command 需要automake 的aclocal,所以要記得安裝。
bootstrap會依據host system產生configure 這個script。
然後run configure.
:~$ ./configure --enable-parport
要注意 "--enable-parport" 這個option 要手動加入。否則他不會把parellel port 的interface 支援功能加入。
使用parallel port 的話,除了直接對io port access - include <sys/io.h> 外,也可以用/dev/parport0 的方式,就要增加 --enable-ppdev,但是我使用 --enable--ppdev 的code無法讓parallel port 正確動作。所以只好用 direct io port access (後來我還有改parallel port 的bios 設定,由"printer"改為"spp"

然後,開始make
:~$ make
之後,install (需要root 權限)
:~$ sudo make install
install 完後把他加上 S attrib,讓非root的user也可以使用 (direct IO access需要ioperm( ) )。
install 完後,可以試run看看..
:~$ openocd
Info: openocd.c:93 main(): Open On-Chip Debugger (2007-09-05 09:00 CEST)
Warnning: parport.c : 395 parport_init( ) : no parport specified, using default '0x378' (LPT1)
Error: jtag.c : 1253 jtag...
.OK。
因為我們有自己的jtag board,pin assignment 和wiggler 不一樣,所以要修改code。
parallel port pin assignment 在 src/jtag/parport.c,在line 97 的地方有支援的 parallel port dongle pin assignment 宣告。

所以新增一個entry : sjf..
 { "sjf", 0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
...這就是要作上一篇 jtag board sch 的原因。
後來發現pin definition 和 chamelen 一樣。
我們的小板子和 target board connector 有lay nTRST。但是到了parallel port board (74HC541) 就沒有lay nTRST。所以沒辦法控制 nTRST。
改好,make, make install。

修改config,原source 已經包含很多 cfg 的sample,在doc/configs 下。但是arm920t的cfg只有arm9_ft2232。

用 openmoko 的cfg 好了,比較接近..

到這個link(http://wiki.openmoko.org/wiki/Neo1973_OpenOCD) 去.. download openmoko 的openmoko.cfg
$ wget http://people.gta01.hmw-consulting.de/laforge/misc/openocd.cfg
修改一下..改為用sjf (剛剛改的...):
#daemon configuration
telnet_port 4444
gdb_port 3333

#interface
interface parport
parport_port 0x378
parport_cable sjf
jtag_speed 8

#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst #srst_pulls_trst

#jtag scan chain
#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
jtag_device 4 0x1 0xf 0xe

#target configuration
daemon_startup attach
#target
target arm920t little reset_run 0 arm920t
#working_area 0 0x200000 0x4000 backup
run_and_halt_time 0 5000

#flash configuration (K9D1208V0M: 512Mbit, x8, 3.3V, Mode: Normal, 1st gen)
#NOR flash configuration (SST39VF400A 4Mbit, x16, 3.3V, 128sect, 4k/sect, 8 blocks (64kByte per block)
# flash bank cfg addr length chip_width bus_width target
#flash bank cfi 0x00000000 0x80000 2 2 0
紅色部份就是修改的地方,save成openocdsjf.cfg。

接上debug board,,, power on。開始..
$ openocd -f openocdsjf.cfg
Info: openocd.c:93 main(): Open On-Chip Debugger (2007-09-05 09:00 CEST)
代表openocd正確執行了....否則會有error mesasge..

openocd 是一個daemon,提供一個 telnet connection (port 4444) 讓user 溝通。
所以,另外開啟一個console..用telnet 連線..
charles@rbtlegacy:~$ telnet 127.0.0.1 4444
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Open On-Chip Debugger
>
成功!出現command prompt!!

連上後,target system 還是可以正常執行,
下command: halt:
> halt
requesting target halt...
> Target 0 halted
target halted in ARM state due to debug request, current mode: Supervisor
cpsr: 0x60000013 pc: 0x338053a4
MMU: disabled, D-Cache: disabled, I-Cache: enabled
>
target system 停止,然後下resume:
> resume
Target 0 resumed
>
target system 又繼續動作,,,

command 可以在telnet 下help ,會列出:
> help
help display this help
sleep sleep for <n> milliseconds
version show OpenOCD version
shutdown shut the server down
exit exit telnet session
log_output redirect logging to <file> (default: stderr)
debug_level adjust debug level <0-3>
jtag_speed set jtag speed (if supported) <speed>
scan_chain print current scan chain configuration
endstate finish JTAG operations in <tap_state>
jtag_reset toggle reset lines <trst> <srst>
runtest move to Run-Test/Idle, and execute <num_cycles>
statemove move to current endstate or [tap_state]
irscan execute IR scan <device> <instr> [dev2] [instr2] ....
這些command可以看一下..有很多有用的command..
可以有些command 雖然有列出,但是沒有support,像...disassemble.

OH!! 可以attach CE machine,連上後,CE machine會繼續run,然後用halt 暫停,之後在用 resume 繼續run!!
halt 之後,可以用mdw 讀取任意位置的記憶體喔。
(但是因為mmu已經開啟了,所以address 藥用virtual address)。

"poll" 命令可以用來看arm core 目前的狀態 running, halt, or ?


有關openocd 的command,在openmoko和openocd的document都有說明,可以參考一下。
其中openmoko 這一篇,還說明如何用openocd作load image and run 的動作。

jtag board sch





printer pinout
printer register definition

330 GND A1 -- B6 -- C6
TCK A2 -- B5 -- C5 -- D14 -<<- D06 -- P02 : DATA0
TMS A3 -- B4 -- C4 -- D12 -<<- D08 -- P04 : DATA2
TDI A4 -- B3 -- C3 -- D13 -<<- D07 -- P03 : DATA1
nTRST A5 -- B2 -- C2
V3.3 A6 -- B1 -- C1 -- D20 - VCC
TDO A7 -- B7 -- C7 -- D09 ->>- D11 -- P11 : BUSY : status[7] invert
GND A12 -------------- Dxx GND

這個board的layout方式與openocd 中定義的 "chameleon"cable 一樣:

/* name tdo trst tms tck tdi srst o_inv i_inv init exit led */
{ "chameleon",0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
但是沒有hardware reset 的功能 : trst。
另一個cable define "triton",和chameleon一樣,但是多了trst 定義:

{ "triton", 0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
要改成 triton, trst 要 接到 printer port 的 DATA3 - P05

9.19.2007

挖地圖挺方便的


是利用googlemap 做出來的,輸入地址後,可以產生讓你內嵌的html code。copy 後就可以用囉。

地圖的大小可以自己決定喔。


http://wamap.net/

9.18.2007

Google Doc 出 簡報軟了

終於。
至此Google Document 算是完整了吧。
測試了一下。
http://docs.google.com/Present?docid=ajb6rhmm7kmw_1835v2k2k&fs=true
不像 試算表,有內謙功能,

但是在作presentation 時,有groupe 討論在旁邊(所以可以當作群組討論 ?)

9.17.2007

Build wxWidget with VS2005

Building wxWidget under VS2005.

先要安裝 Windows Mobile 5.0 Pocket PC SDK.msi - 雖然,我是要build for CE, not PPC。

get wxMSW-2.8.5.zip,解開。
用VS2005 開啟 build\wince\wx.vcw。
出現 convert ? 視窗,回答Yes.
然後就出現 "Cannot load the project dure to a corrunt project file"。
本來以為是wxWiget 的問題,所以去download 了其他版本,結果都一樣,還到new groupe 去問,想想,直接google 這一句error 看看...
是VS2005的問題,他不認識Unix file format,也就是說 換行符號要有'\r' 才行。
所以在linux 下解開,把所有build\wince 下的 *.vcp, *.vcw 用awk 修正..
awk 'sub("$","\r")' wx.vcw > wx.vcw.0
再用VS2005 開啟,就OK了。

然後build solution,出現"找不到clthumb.exe",改用 ppc2003 sdk 後,出現"找不到clarm.exe"。
這時候找 wxWidget wiki 就發現,有關WinCE 那一篇,用VS2005 的有說明
http://www.wxwidgets.org/wiki/index.php/Developers_Notebook-WxWinCECompiling
不可以用precompile header。所以將solution 下的project 一一修改後,rebuild,就OK了。
所以要注意每次build 後的report , "4 success, 2 fails"
一直 build, build 到沒有fail 為止。

實際上,我還是沒有成功,因為mono link 時一直出現找不到 wxjpeg.lib...

練習一下shell:
#!/bin/bash
mkdir ../newbuild
for file in *.vc?
do
awk 'sub("$","\n")' $file > ../newbuild/$file
done

9.14.2007

錄音 : Multimedia library

錄音 : 就是把 mic 的輸入 save成WAVE檔。
使用 Multimedia library,也就是 mciSendCommand( ) 這個function。
這個funciton 跟IoControl 類似,都是用command id + command structure 來傳遞資料。
所以很麻煩的每個動作都要準備好作為argument 的structure。

先 Open:
mciOpen.dwCallback = 0;
mciOpen.wDeviceID = 1;
mciOpen.lpstrDeviceType = TEXT("waveaudio");
mciOpen.lpstrElementName = "";
mciOpen.lpstrAlias = NULL;
dwError = mciSendCommand(0, MCI_OPEN, MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,
(DWORD)(LPMCI_OPEN_PARMS) &mciOpen);
if( dwError != 0 )
{
rtnMsg = "Open record device error; ";
return 0;
}
//save the Device ID
wRecordDeviceID = mciOpen.wDeviceID;
open 好的id 放到 wRecordDeviceID。 ( 這個以後作為對 錄音device 的control handle)。
然後,設定sample 格式
    DWORD dwFlags = MCI_WAVE_SET_FORMATTAG |
MCI_WAVE_SET_BLOCKALIGN |
MCI_WAVE_SET_CHANNELS |
MCI_WAVE_SET_BITSPERSAMPLE |
MCI_WAVE_SET_SAMPLESPERSEC |
MCI_WAVE_SET_AVGBYTESPERSEC|
MCI_WAVE_INPUT;
mciSet.wInput = 0; //recordsource index
mciSet.wFormatTag = WAVE_FORMAT_PCM;
mciSet.nChannels = 2;
mciSet.wBitsPerSample = 16; //8 or 16
mciSet.nBlockAlign = 4;
mciSet.nSamplesPerSec = 8000;
mciSet.nAvgBytesPerSec = mciSet.nSamplesPerSec * mciSet.nBlockAlign;
dwError = mciSendCommand(wRecordDeviceID, MCI_SET, dwFlags,
(DWORD)(LPVOID)&mciSet);
if (dwError != 0)
{
rtnMsg = "Not support specific record id; ";
return 0;
}
然後...
下command 開始錄音了..
    mciRecord.dwCallback = NULL;
mciRecord.dwFrom = 0;
mciRecord.dwTo = 0;
dwError = mciSendCommand(wRecordDeviceID, MCI_RECORD, MCI_NOTIFY,
(DWORD) (LPMCI_PLAY_PARMS)&mciRecord);
if(dwError != 0)
{
rtnMsg = _T("Not support specific record format; ");
}
然後,等等等...錄夠了..
叫他存起來:
    mciSave.dwCallback = 0;
mciSave.lpfilename = "TTTTT.WAV";
if( wRecordDeviceID != 0 )
{
mciGeneric.dwCallback = 0;
mciSendCommand(wRecordDeviceID, MCI_STOP ,MCI_WAIT ,
(DWORD) (LPMCI_PLAY_PARMS)&mciGeneric);
mciSendCommand(wRecordDeviceID, MCI_SAVE ,MCI_WAIT|MCI_SAVE_FILE,
(DWORD) (LPMCI_PLAY_PARMS)&mciSave );
mciSendCommand(wRecordDeviceID, MCI_CLOSE,MCI_WAIT ,
(DWORD) (LPMCI_PLAY_PARMS)&mciGeneric);
wRecordDeviceID = 0;
}
這樣就把錄到的資料放到 "TTTTT.WAV"這個file理了..

multimedia library 要include mmsystem.h
並且要 link Winmm.lib,否則會找不到 mciSendCommand( ) 這個function.
這個function 是假設你的pc 只有一個音效卡,在opendevice 時,直接指定 mciOpen.wDeviceID = 1 。

還有,要設定是用MIC還是LineIn 的話,在 control panel -system -hardware - audio 的


很愚蠢的,是"音量"那一個button,會出現右邊那個dialog.

VC6 to VS2005 的問題

VC 6 升級到VS2005 還是一些問題:
error C2440: 'static_cast' : cannot convert from 'BOOL (__thiscall CExampleDlg::* )(void)' to 'AFX_PMSG'
error 發生的位置是在 Message Handler 宣告的地方:
ON_BN_CLICKED(IDC_BUTTON1, OnButtonTestvoid)
google 結果是 ON_BN_CLICKED( )的handler function return 值是 void 才對,而我的code OnButtonTest( ) return 值是 BOOL。
所以.. 修改一下就OK.

還有..
error C2668: 'log' : ambiguous call to overloaded function
發生在statement:
expo = (log(num))/(log(10));
的地方,解法是..手動cast
expo = (log((double)num))/(log(10.));

9.11.2007

test google doc : 發佈功能

測試一下google doc 發佈內嵌的結果..

連相機都有open source 軟體 - CHDK (for CANON)

這一篇 How to give your low-end Canon digital camera RAW support

因為 CANON 的DIGIC II 引擎是arm core,而且有人又找到load program into ram 的方法,所以有了這個專案 : CHDK

專案含full source code and build instruction. (ref CHDK Wiki)

load firmware 的方法是利用SD Card,是在執行時load,所以不會erase 掉原來的firmware (not sure)。

這個軟體新增的功能有:
  • RAW 影像檔
  • Zebra 模式 (在preview 中機過曝與不足區域標示出來)
  • live histogram 顯示
  • game.
  • sd file browser
  • battery voltage
  • script 執行能力 (snap and shoot with specify shooting parameters)
所以,hacker 們,去買台CANON 相機吧!

9.10.2007

software reset implementation : watchdog or software jump

真的見識到..

software reset 發生問題...
因為是利用 watchdog reset 機制做出software reset 的動作。
以往沒問題的版本是用 jump 動作 (jump 到 start point)。

所以.. 修改 .. 改為software jump 。

本以為 software jump 要模擬 watchdog reset 的動作,在reset 前將所有 hardware power (GPIO )關閉,將 週邊register (LCD, USB, CLK...etc), reset。
結果導致 啟動後 LCD 沒畫面 (白畫面)。
但是從 boot prompt sound 判斷,似乎OS有boot 起來。

所以 ..,, 把所有"模擬watchdog reset 的code" 移除掉後..
就OK 了。


Software Jump 和 Watchdog reset 的差異:
  • Watchdog reset : 啟動 watchdog reset,讓他timeout,發生 watchdog interrupt。watchdog reset 會reset program counter。讓 cpu 由 0x00 開始執行。
  • Software Jump : 自己寫code,跳到 0x00 執行。

其實還有一項奇妙的東西...

0x00 開始的bootcode,會利用 週邊暫存器 來判斷是 hardrest (cold boot : register 會被清空) 還是 software teset (該register 不會被清空)。決定要 load image from nandflash (hard reset)再jump to ram 或是 直接jump to ram (software reset)。

hardware reset 的jump address 和 software reset 的 jump address 不一樣。
差距 0x1000。 (0x30200000 和 0x30201000)
但是看 0x30200000 該處的code ,就是一個 jump 到 0x30201000 的instruction。
所以jump 到哪裡都一樣呀。

但是 software reset 的jump 一定要jump 到 0x30201000,不然的話會boot 不起來.

Robert 說:唯一的可能就是 Software reset 後,代表0x30200000 該處的code 已經被修改了,不是 jump 到 0x30201000。
如果是這樣的話... CE kernel 真是博大精深呀,是 self modify code

9.05.2007

PPC 2003 SDK : unresolved external symbol "const type_info::`vftable'"

原來用CE SDK 都沒事,改用PPC SDK build,出現
unresolved external symbol "const type_info::`vftable'"
google 到這一篇:The Run-time Type Information library for the Pocket PC 2003 SDK is available,原來是PPC 2003 SDK 的STL沒附 RTTI。

但是 MS已經在2004 年很好心的補上這個 library。

  1. download 後,解開,會有Armv4, emulator 兩個folder,裡面有 ccrtrtti.lib(pdb)。
  2. 將這兩個檔案 copy 到對應的 C:\Program Files\Windows CE Tools\wce500\Amber SDK 003\Lib\ARMV4I 和 (emulator) 下。
  3. 修改 eVC 的Project,在 Project Settings -- Link 的 object/library module 中加入 Ccrtrtti.lib。
  4. 在 Project Setting -- C/C++ 的option 中加入 /GX option。
注意,所有使用 ppc 2003 sdk 的都要加上以上修改,並非在library project 才加。
重新build (link)後,就可以了。

9.04.2007

VS2005 for smartphone 2003 device "bootstrap could not be loaded"

上一篇,可以用VS2005開發smartphone application。不必用 eVC。
但是在 debug 時,卻會出現 "bootstrap could not be loaded" 的error。
google 說 ..

因為VS 的debug channel 使用不一樣的方式,不是用 active synch。
所以要改回activesynch 的話,就要裝ActiveSynch,然後把

%userprofile%\Local Settings\Application Data\Microsoft\CoreCon\0.1

這個folder 刪掉,重開VS2005。
VS2005 就會重新create一個用ActiveSynch 作debug channel 的 0.1 folder 了。

8.31.2007

VisualStudio 2005 : build for ARMV4

VisualStudio 2005 原來內建 smartphone sdk.
在create project 時,選platform 選 ppc smartphone 就可以,
接下來會問你藥用哪個sdk,他內建 smartphone 2003 ARMv4 的SDK。
但是你有另外安裝的SDK,也會出現。
然後就跟 eVC類似,選MFC DLL是要static link 和是share,在VS2005後建議 MFC DLL用static link。

8.30.2007

TFAT Overview

MSDN 翻的:

傳統的FAT 檔案系統在修改檔案的過程中有機會被中斷.所以Data Loss 和檔案系統毀損的現象常常會在拔出Stroage Card或是斷電時發生.

TFAT 檔案系統利用"transaction-safe"的操作, 讓這樣的狀況部會發生.

TFAT利用兩個FAT Table : FAT0, FAT1。 所有的檔案操作會先對FAT1操作。當操作完成時,再將FAT1 copy 到FAT0。

在確認所有的操作都完成後後,才會修改到 FAT0,所以如果操作完成前被中斷,FAT0 還是維持上一個完整的狀態。

TFAT的預設是在對目錄操作時,才會backup FAT。

如果想要在作 file 操作時也backup FAT. 可以把 TransactData registry key 設為 1.
如果把 ForceWriteThrough 也設為 1, 每次 write operations 完成後,都會 backup FAT。

當修改某一筆檔案資料時, TFAT 先找到一個 new cluster ,儲存修改的部份,然後修改FAT chain,把這個clust 替代原來的部份. 這樣是為了避免在修改完成前,被中斷掉,導致原來的檔案資料被修改,但又沒有修改完畢 ( currupt).

TFAT 檔案系統適用於 non-removable media 例如 NAND and NOR flash memory.
Removable media 也能能使用 TFAT, 但是在Desktop 環境(Windows)使用TFAT 裝置可能會有問題. 因為Desktop 環境的作業系統並沒有實做TFAT 檔案系統, 他還是會用舊有的FAT 檔案系統來處理TFAT 的裝置.

如果TFAT裝置是在某種(critical operation)下從ce裝置取出,Windows 可能沒辦法正確辨識TFAT 內容.

在Windows desktop operating system中對TFAT裝置所作的修改,即使放回CE裝置下,都不再是 Transaction Safe。
如果Windows 在TFAT 裝置中create一個目錄,在放到CE裝置,則從此所有對該目錄的操作都不是transation sage.
除此之外TFAT裝置在正確操作下(也就是在CE中) Create的目錄,放到Desktop後將無法被刪除。I


歸納一下
  • TFAT 就是利用backup FAT的方法,防止在 currpt。
  • bacup FAT 的時機,default 是在有目錄操作時才作,但是可以修改registry ,讓他可以在所有修改後都backup。
  • Windows 可以讀寫TFAT,但是會對TFAT有不好的影響,所以最好不要這樣作,不好的影響包括:
    • 經過 Windows 修改的file,不再是transation safe.
    • CE create的目錄,在Windows無法刪除。

實際操作:
在registry 加上FormatTFat,將partition 刪掉,重新安裝OS。

  • 如果該partition 是以FAT32 (相容)模式format,用mass storage 看是一切正常的 (只有看)。
  • 如果該partition 是以FAT16 (相容)模式format,用mass storage 看,會出現一個HIDDEN_ROOT 的folder,原來在根目錄的data都變成在這個 HIDDEN_ROOT 下。
也如說明所述:
在CE中create的folder,在mass storage mode,Windows 無法刪除 (但是file是可以刪除的)。
自己連一下.. 上次寫過的 .. TFAT : Transation Safe FAT

8.28.2007

Nice - Display resolution

這個在Wiki中看到的resolution 說明圖片很不錯,除了可以看到各規格的大小之外,他的"對角線"設計可以看出喇些規格是可以等比例放大,縮小。

圖片下面的link 是我自己加上去的。

ANStek , Analog Device

ADV7180


代理 : 安馳科技

02 26982526
陳國龍 Eric Chen (好像離職了)
eric@anstek.com.tw


Justin Wu

Justin.Wu@anstek.com.tw
02-26982526
0987-131872




原廠 : Analog Device

02 27195612 ext 274
陳奎光 Rocky Chen
rocky.chen@analog.com


0932929702

Jerry

SDTV Video Decoder ADV7180

就是把analog的CVBS或是Y/C或是YPrPb信號轉為digital的BT.656 YCbCr 4:2:2。
控制介面和一般的video decoder一樣 - I2C。

雖然根據datasheet 說明,內部有很多fancy 的功能,但是對software engineer來說,就是AD converter 而已。

Analog Input 介面:

有4-6個input 可以選(隨package而有不同)。
每個channel 可以輸入 CVBS, Y/C 或是 YCbCr。
  1. 當輸入 CVBS時,每個AIN都可以獨立使用。
  2. 當輸入Y/C時,(1,4),(2,5),(3,6)各成一組。
  3. 當輸入 YCbCr時,(1,4,5),(2,3,6)各成一組
AIN的輸入類型(CVBDS, Y/C,YCbCr),必須要由register 0x00 來設定。

有關 interrupt 部份,這裡 還有一些說明..

Linux in Airplane

最近的新聞
新加坡航空將在新的Airbus A380 和Boeing 787 的每個座位上安裝含40GB 容量的PC。
用來提供每個座位自行決定播放的影片。
這些PC都是run Redhat。

目前的影片播放系統,或說是獨立的lcd 系統,好像是run Novel Netware。
有一次在飛機降落時,LCD reboot,我看到boot log上的顯示....

DVBT Module - ASUKA

包含 DBCOM 的的RF和 MPEG2 decoder,並且有作customize software integration.

Jeff Chen

03 6667117 ext 208
jeffchen@asuka-semi.com.tw

Super Cool PND - Provia

這個韓國的PND做得太cool了點,他的3D根本就跟Game 一樣:


LCD 還是7"的。

這個網站也直接說 too cool!

目前高架道路一團亂的情況下,3D導航應該是趨勢吧。
要做到這樣(可以到http://blog.tmcnet.com/blog/tom-keating/gps/provia-a1-gps-too-cool.asp去看另一張圖,那個廟(牌樓)的樣子,還真的用3D 模型畫出來)。



因為是7",所以還有PIP功能喔。

這樣的device,cpu 不知道適用哪一顆.

8.27.2007

懲罰: 使用Windows (?)

有趣的新聞,一位因為上載影片到P2P的user 被判緩刑,同時規定,緩刑期間,如果他要使用電腦,必須要使用Windows. (他原來是使用 ubuntu 7.0)。

是說..要他使用Windows,作為一樣懲罰 :p ?

原因是..他的緩刑監察官必須要能Monitor他的網路行為,所以必須要安裝一個monitor軟體在他的電腦上,而這個軟體只支援Windows,所以..他必須要安裝Windows,好讓監察官能安裝他的軟體。

新聞是 cnet 看到的,哪個人的blog 在 "這裡"。

8.23.2007

Small Headphone AMP

MAX9723

是簡單的 Headphone AMP。

  1. 內含charge-pump,所以單電源就可以驅動。
  2. I2C介面 Gain (Volume) Control。
  3. BassMax enable/disable, Hardware 設定Bost level。

I2C Address 有四種可以選,但是有四種不同料號...
I2C 的command 只有一個 (也就是說...只有一個register)。只有write,沒有read動作。

PowerUp Reset 時,Register value 是在 "Shutdown" state。

慣性拖拉 - OpenMoko 也有囉

iPhone 介面中很有趣的"慣性拖拉"動作:就是說可以直接在list上上下拖動,然後放掉,list還會再動一下,然後停住,這個動作,openmoko的gnome interface team 也完成了。

developer的blog中有影片,跟iPhone一樣喔。
真有趣,可以去看看。


interface好像是用python寫的..馬上有人放到Nokia N800 上了。

follow link... 好像有提到 iPone like virtual keyboard. 照這樣看來,openmoko 會變得比iPhone更cool的手機了。

這一篇文章有提到,一堆有關 mobile device user interface 的新作法 (雖然有些都是模仿iPhone)。

希望就像 Mac 帶領PC由 text command 進入 GUI,iPhone也會讓所有的mobile device有新的風貌。

8.22.2007

MAX 9850 Audio Codec with headphone AMP

MAX 9850

內含charge-pump 產生headphone需要的負電壓,所以不需要 hearphone GND不需要耦合電容。
charge-pump 電路需要手動啟動/關閉 (但是要headphone sense pin active才有辦法啟動)。

可作 Ananlog input 與 Digital input 混音。

內建 headphone sense input detects,在無headphone時自動切斷headphone電源。
所以,不想使用這個功能時,要確保該detection pin 不至於將headphone AMP 關閉。
(所以要拿headphone output 作其他用途的要注意了..)

只有 headphone有volume控制。

混音後輸出至 LineOut,在由 LineOut 輸出到headphone AMP,所以將LineOut關閉,headphone也被關閉。
9850 沒有LineOut AMP,所以datasheet 上建議配合 MAX9773 (Stereo)。

MAX9773 是D類1.8W (4 ohms) AMP。gain 可由 hardware resister 決定 (所以不是software 可調),另附phase synch signal,可以配合另外的D type AMP 。

8.21.2007

DeviceIoControl

DeviceIoControl 的MSDN reference 在 http://msdn2.microsoft.com/en-us/library/ms960189.aspx

以 WAVEDEV 為例

IO Control Code 定義在 PUBLIC\COMMON\OAK\INC\WAVEDEV.H 中

這個 header file 的 comment 中有說明 audio driver 的複雜架構。

WAVDEV 處理的IO Control Cmd 有
  • IOCTL_MIX_MESSAGE
  • IOCTL_WAV_MESSAGE
都定義在這裡,這兩個 command code 都屬於 FILE_DEVICE_SOUND (分別是 3, 115)。

device io control 又把parameter 作進一步擴充,把argument 再定義為 message (PMMDRV_MESSAGE_PARMS):
typedef struct {
UINT uDeviceId;
UINT uMsg;
DWORD dwUser;
DWORD dwParam1;
DWORD dwParam2;
} MMDRV_MESSAGE_PARAMS;
所以.. WAVEDEV 的IO Control handler 再依照 uMsg 細分 command。

使用時,要先CreateFile("drivername"..),"drivername"就是那個 3 char + 1 index.
取得的handle 傳入 DevIoControl ( )作第一個argument,

prototype:
BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped);
和 KernelIoControl( )比起來,除了一開始的 hDevice外,就是最後的 Overlapped. - 這個固定要用 NULL。

8.20.2007

KernelIoControl

ref msdn http://msdn2.microsoft.com/en-us/library/ms886729.aspx
argument 依序是
  1. CommandConde
  2. InBuffer Pointer
  3. InBuffer Size
  4. OutBuffer Pointer
  5. OutBuffer Size
  6. Buffer Pointer to Save the returned value (DWORD)
就和 Linux 的 IOControl 一樣。

但是這個 IOControl 是對 Kernel ,在source code上來說,也就是 OAL。

CE 的 Driver 都是run 在 User Space (6.0以前),所以driver 的access 方法不一樣。
driver 的iocontrol 和 linux 的比較類似,就是 open device,然後用iocontrol function。

但是 kernel 不是 driver,所以就不用open 了,直接呼叫 KernelIoControl( )就可以。

自己要加一些 Kernel IoControl command的話,要
  1. 先define IOControl code ,用 CTL_CODE 宣告,有很多argument和限制,ref http://msdn2.microsoft.com/en-us/library/ms904001.aspx
  2. 在oal 中寫好處理的function,通常會是 OALIoCtlXXX( ),這個funciton 的argument也是限制的,要符合iocontrol 的四個argument : in,insize,out,outsize。
  3. 在oak_ioctl_tab.h 中建立IOcontrol code和 iocontrol function 的關聯。



在 CTL_CODE的說明頁,有說明可以指定 cotrol type.(oal 的就是FILE_DEVICE_HAL)。
這樣看來,也可以用 FILE_DEVICE_BATTERY 來指定由battery 來handle ?

FM Transmitter

THG4649

使用 SPI ,但是data 只有write,沒有read動作 (也就是說 THG4649 沒有東西要給你知道)。
  • 有一個奇怪的規定,在CS Low (select)之前,CLK先作至少2個clock,在CS High(de-select)後,CLK至少再有兩個clock。
  • Data好像是 clock rising edge strobe。
command 內容並不嚴謹:大概就是把設定的資料串起來,一個bit一個bit的送出去。
後來發現不夠,又再增加一串資料。

大概說一下:
  1. command有 0 - 23 個bit組成
  2. bit 0.1.2 用來決定command內容 (datasheet依次命名為Word A, B,C)
  3. spi protocol 採用 big endian 所以D23先送
Word A, B, C對應的 D0.1.2 依次是
  • A : 0x07 - 主要是 N (program counter freq division ratio)
  • B : 0x06 - 主要是 R (reference counter freq division ratio)
  • C : 0x05 - 主要是 F (sub carrier counter freq division ratio)
N.F.R 決定 FM freq :
 FM頻率= [(8xN)+S] x (Fosc/R)/4
但是N.R.F 的bit都不是24-3 bit,所以剩下的bit 用來塞其他的參數。

這樣塞command倒楣的就是會有參數塞不下,被分到兩個command中: 參數A (Audio Signal Level adjustment bit) ,A[2.1]在Word A,A[0]在Word B。

慘的是,還規定了Word A, B, C 的寫入順序:
  • C, B, A
然後建議改頻率最好是改A或是B的data就好。
因為寫C時,PLL not lock。

8.09.2007

fopen with "w" cause file reset

fopen( )使用 "w" 作為 open mode。如果open的file已經存在,在一open時,file會被reset (清空)。
一直到fclose( )之後,file 內容才會真正的update。
除非在中途用fflush( )強制update。

所以..
若是系統在 fopen( )後,fclose( )之前。系統被reset (power down)的話,被open 的 file 就變成 empty 了。

MSDN fopen

使用CreateFile( ) , WriteFile( ),CloseHandle( )就不會。
即使是用 CREATE_ALWAYS, GENERIC_WRITE。

在CloseHandle( )之前被reset的話。原file內容不會改變 。

在CloseHandle( )之前,該file 的內容都是舊的 (不會被清空)。

MSDN CreateFile

這是只有WindowsCE的fopen( )才是這樣,還是所有的OS都是這樣 ?

PS : 以上動作跟 Media 有關,在Nandflash create的partition 是這樣。
在 SD card則不一樣。

SD card 在 fclose( ) 和 CloseHandle( ) 前reset 的話,該file 會keep 原內容。

8.08.2007

SD Card Identify

這裡,TI 的TMS320DM644x SD Card Controller User's Guid
Sec 3.1 Card Identification Operation
大略翻譯一下:

進行 SD/MMC Card的一般傳輸動動之前,先要對bus上所有的card作identify 和 configure。

先下 ALL_SEND_CID broadcast command。請bus 上的card回應。
controller收到回應後,再讀取card的 uniqure card identification address (CID)。
之後再assign 一個 relative adress (RCA)。

RCA 的長度比 CID短,

之後,controller和 card 之間的傳輸,都用這個RCA作為定址的方法。

SD Card的 identify procedure
  1. 送 GO_IDLE_STATE (CMD0) 給SD card。

    這個command讓所有的card進入idle mode。

  2. 送 APP_CMD (CMD5) 給SD card。card會回應 R1。

    這個command告訴card 接著會是application command。

  3. 送 SD_SEND_OP_COND (ACMD41) 並且包含一個argument告訴card support voltage ranage。card會回應 R3。

    這個command可以用來辨識card是否支援controller 提供的voltage range。

  4. 送 SD_SEND_CID (CMD2)給SD card。 card收到會回應 R2。

    這個command請所有的card送出他們的CID。由於SD card 的設計,會只有一個SD Card能夠成功的送出CID。送出CID的Card會進入identification state,不會再回應這個command,好將回應的機會留給其他還沒回的Card。

  5. 送出SEND_RELATIVE_ADDR (CMD3)給SD Card,請Card將Relative Address送回來。

    只有剛剛成功回覆 CID的SD Card會接受這個command。並且回應 R1和他的Relative Address (in R6)。之後,會進入 Data Transfer Mode。

  6. 反覆4, 5,當沒有SD Card回應 SD_SEND_CID command,代表所有的SD Card都進入 Data Transfer Mode。Identification 完畢。
上面提到的pdf,p 31 Figure 13 有一個清楚的procedure diagram。

MMC Card和 SD Card 不一樣的地方是 MMC Card需要 controller 指定 RCA,所以在procedure 5 後,要再下一個SET_RELATIVE_ADDR (CMD3) 設定MMC Card Address。

無解 : VC6 project migrate to VC8 (VS2005)

VC6 的project 轉到 VS2005後,完全不能用。
build error 一大堆。

像是..
unresolved external : __RTC_Shutdown
這個RTC不是embedded system中常用的 Real Time Clock。而是 Run Time Check 的意思。
所以要將 Project Property - C\C++ - Code Generation 中的 "Basic Run Time Check" 改成Default。

還有
unresolved external symbol : __security_cookie
這個是VS2005 的"Buffer Security Check"的mark,所以把 Project Property - C\C++ - Code Generation 中的 "Buffer Security Check" disable 就可以。


但是
 unreolved external symbol : ___CxxFrameHandler3
這個就沒救了,google了大半天,也沒有人有解答,即使是MSDN forume也沒有。
原因大概是在VS2005,Exception Handler internal class 已經改名為 CxxFrameHandler4了。
所以 ?


解法就是 .. 去check 你所有link 的library和prebuild code,有沒有和VC6 library link的。如果有的話就重新 build 那些code,改用 VS2005 library 。

8.06.2007

買產品還是買服務

TomorrowNow 提供PeopleSoft的軟體支援服務。

2005 年,Oracle 買下PeopleSoft。
之後, SAP就買下 TomorrowNow。

原來Oracle是希望併購PeopleSoft後,能讓原PeopleSoft的用戶改用Oracle的產品。
因為PeopleSoft被Orcale併購後,自己的軟體產品就終止了。

結果因為提供售後服務的TomorrowNow被SAP併購。
所以那些PeopleSoft的客戶在合約到期後,反而接受Tomorrow的建議,改採SAP。

8.04.2007

陰謀玩家的橘子蘋果經濟學

這禮拜買的..

其中.."Woznic 試讀本",實際上是...


橘子蘋果那本挺不錯的..
  • 房屋仲介不會認真的設法提高賣價,因為提高售價對他來說,只增加一點點利潤,倒不如快點賣掉,早點拿到錢。

8.03.2007

變更USB-SERIAL 的COMPORT index

Record : Samsung phone, phoneboook format.

SAMSUNG手機 的 phonebook log:
<U001247b57913SGH-E628><X15><O><Bb><#0><#
1><L1Service",,800><#2><#3><#4><#5><#6><#7><#8><#9><#:><Be>
所以知道是 format 1 type : L1.
所以 Format 1 的格式就是 ... Name 和 Number 都是 plain ascii。
-- 多一個 ',' 是幹什麼用的 ?

Value definition in FATFS

SDMMC\Driver\sdmmc.def 宣告了 SDMMC.DLL 公開的介面。
這幾個公開的介面,都實在 system.c 中。

結果:
決定 SDMMC card mount 行為的registry key:
HKEY_LOCAL_MACHINE\System\StorageManager\FATFS
中的
Flags
的各bit 定義在: COREOS\FSD\FATFS\fatfs.h。在MSDN 的FAT Filesystem registry Setting 這一篇也有說明:
FATFS_UPDATE_ACCESS         0x00000001  // update access times if set
FATFS_DISABLE_LOG 0x00000002 // disable event logging if set
FATFS_DISABLE_AUTOSCAN 0x00000004 // disable automatic ScanVolume()
FATFS_VERIFY_WRITES 0x00000008 // verify all writes (as opposed to a handful)
FATFS_ENABLE_BACKUP_FAT 0x00000010 // add a backup FAT to all formats
FATFS_FORCE_WRITETHROUGH 0x00000020 // Force fat to be always writethrough
FATFS_DISABLE_AUTOFORMAT 0x00000040 // disable automatic formatting of unformatted volumes

FATFS_WFWS_NOWRITETHRU 0x00010000 // disable writethrough on WriteFileWithSeek API, improve
// memory-mapped file performance
FATFS_DISABLE_FORMAT 0x00020000 // disable format
FATFS_TRANS_DATA 0x00040000 // transact data on a write (i.e. clone cluster on every write)
FATFS_TFAT_NONATOMIC_SECTOR 0x00080000 // Use cluster 1 entry in FAT table for TFAT transaction,
// since sector writes are non-atomic.
// By default, TFAT uses the NOF field of the boot sector
FATFS_DISABLE_TFAT_REDIR 0x00100000 // Indicates to disable redirect the root directory to
// another hidden director for FAT12 or 16, since root dir
// isn't transacted in those cases
FATFS_TFAT_ALWAYS 0x00200000 // Always mark transaction status, even only one sector in
// FAT is changed
FATFS_FORCE_TFAT 0x00400000 // Force TFAT transactioning even if volume isn't formatted
// as TFAT
FATFS_LFN_EXTENDED 0x00800000 // Generate LFN entries for extended characters always
FATFS_TFAT_DISABLE_MOVEDIR 0x01000000 // Disable MoveFile on a directory for TFAT because it isn't
// transaction-safe
所以要disable SD card 的 autoformat功能,就要設定 FATFS_DISABLE_AUTOFORMAT :
0x40

這個filesystem 好像會和nandflash 的filesystem 共用。所以大概會影響到nandflash filesystem..

building kernel in Debian's way

http://www.enterprisenetworkingplanet.com/netos/article.php/3691636

Debian 的 kernel source packages 叫做 linux-source-[version].
目前官方的kernel 版本是
  • linux-source-2.6.18 (stable)
  • linux-source-2.6.21 (testing and unstable)
  • linux-source-2.6.22 (unstable and experimental).

Binary kernel packages 會叫做 linux-image-[version].
從 2.6.12 版以後,開始使用這樣的方式。以前的package命名方式是 kernel-source 和 kernel-image packages.

取得kernel source 後,還需要build tool:
# aptitude install linux-source-2.6.22 kernel-package fakeroot
download 下來的source code會放在 /usr/src/。
我們先把他move 到 我們自己決定的 build directory:
# mv /usr/src/linux-source-2.6.22.tar.bz2 ~/kernel
到該目錄下,解開source
$ tar zxvf linux-source-2.6.22.tar.bz2
到解開的source 目錄下,開始config:
$ cd linux-source-2.6.22
$ make mrproper
$ make xconfig
Config完後,作:$ make-kpkg clean
$ make-kpkg -rootcmd fakeroot -rev kernel.1 linux_image
fakeroot 可以讓一般user 有build kernel 的權限,但不會讓你有run 其他command的權利.。

完成後,會有linux-image-2.6.22_kernel.1_i686.deb.
所以可以用dpkg來安裝(這樣,還會有機會用 -rev 解除安裝):
# dpkg -i linux-image-2.6.22_kernel.1_i686.deb
This installs the modules and handles module dependencies, creates a boot menu entry, and copies the kernel and related file to the /boot directory. Now you can reboot, select your new kernel from the boot menu, and play with your new kernel.
以上,純粹翻譯link文章的第一段。
原來是source 的package name不一樣了...

8.02.2007

eVC - enable unwind : /GX option

在eVC中用了try...catch( )結果build時出現:
warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify -GX

這可糟糕,沒有unwide,可能會有memory leak...

所以要follow 他的instruction,手動在eVC 的 "Project -- Settings -- C/C++" 的 Project Options 加入 "/GX " 這個option。

7.31.2007

SD Card 壞掉了...別丟!! 交給Linux試試..

因為Robert 寫的aggressive SD card driver 改了寫入速度 (其實只是delay count)。
所以.. run program run 一下出現 "Card not formatted" error。

只好拿出來,用讀卡機試試,當然,也一樣,出現 "要格式化 ?" 的視窗。 XP 和 CE來真是同仇敵愾呀。
回答 "Yes" 後 --- format error。

拿數位相機來格式化這個 SD Card,結果也一樣...error。


只好把讀卡機拿到Linux下試試..本來是想dump 一下SD 內部資料..

Linux果然好得多了,有錯會告訴你原因。dmesg 出現的是
"FAT: Filesystem panic (dev sdc)
invalid access to FAT (entry 0x00302e35)
File system has been set read-only"
但是mount起來還是看得到資料...
format 看看.. 先umount ,再
mkfs -t vfat /dev/sdc1
出現
mkfs.vfat unknown command
如果直接用: mkfs /dev/sdc1 是OK的。
所以..看看我有哪些mkfs:
ls /sbin | grep mkfs
果然沒有mkfs.vfat。
那mkfs.vfat 在哪一個package呢?
用 apt-cache search mkfs 看看。出現 "dosfstools" 大概就是這個吧,apt-get 一下。
再執行一次 mkfs,竟然----OK ? 那SD card可以用了嗎?

拿回 XP上,讀寫OK。用XP再format 一次,也OK。

這麼奇怪? copy 大資料試試.....就co 滿1G吧! OK.

**原來重點是... 我先format 成ext2,再format成vfat。才讓SD 復活的。


附帶一個link ,有linux下sd card raw image的一般操作: http://www.freelabs.com/~whitis/sd_card/rawimages.html


Cool ! GPLv3

今天在 "Open Foundry 開放鑄造場電子報第 85 期" 中 "在四大自由精神之下強化的 GPL3" 有說明GPLv3的內容,雖然有很多我都不知所以然,但是有一條:
(2) 使用者產品 (User Product) :若 GPL3 程式是透過產品來散布,例如一般商
店可買到的路由器中有使用到 GPL3 程式,散布這個產品中的程式時,除了必須提
供原始碼外,還必須提供程式安裝資訊,讓後續使用者可以有研究的機會。
...會不會太cool 了呀 :)

7.27.2007

[轉載] 無名小站可以退費囉

XDite 看到的,
此篇原載於 PTT Anti-Ramp (非好店版),作者授權可全文轉錄。

作者 juicyass (汁汁) 看板 Anti-ramp
標題 [情報] 無名可退費
時間 Wed Jul 25 18:34:30 2007
───────────────────────────────────────


一、店名:無名小站


二、地點:網路媒體服務


三、時間:2007/7月


四、此店「非好店」的原因:

無預警片面取消會員密碼,事後要求會員以雙證件證明為本人,
客服管道僅提供線上討論區(哈拉無名小站),針對問題皆以官腔回答,
對問題核心則直接跳過省略。


五、事實經過:

七月初的時候無名小站以提升用戶密碼安全為由,無預警將所有會員的密碼取消,
要求會員重新認證,若信箱無法使用,則必須提供雙證件,以證明為本人。

首先,無名小站無預警的片面取消會員密碼,已經違反合約,因為會員密碼屬個人資料,
他們不能隨意取消,此舉造成付費會員無法使用我們付費所取得的服務。

當初無名小站的註冊資料中,並沒有規定要提供Email,事後又要以Email認證,
若無Email或是Email已無法使用,則要求提供雙證件影本,這種做法非常不妥,
第一,無名小站並不是金融單位,也不是政府單位,依法他們不能向客戶要求這些資料,
第二,雙證件屬於非常重要的個人資料,他們無法提出能夠確保客戶資料安全的証明,
對用戶來說是非常危險的事情。這樣的做法已經受到消基會的糾正。

然後他們提供的客服管道只有線上論壇(哈啦無名小站),針對問題都以官腔回答,而且
每筆問題回答時間皆超過24小時,針對問題核心(像是雙證件的安全、無名站方違反合約)
都是直接跳過,非常惡劣!!

無名在過去使用上就有很多問題,而且都沒有解決。譬如照片無法上傳、上傳後縮圖好
幾天或是永久縮圖、網誌無法順利編輯、計數器不定期歸零、速度異常緩慢、頁面壞掉、
無法觀看等等問題層出不窮,甚至身為VIP會員的我從來沒有一次很順利的使用過無名小
站,他們常常說要停機升級,然後好幾天不能使用,結果升級後還是一樣爛,升級時不
能使用的時間也不賠償給付費會員。

再看這件事情,若真的是要提升會員資料安全,有很多方法和管道可以來做,突然將密
碼取消而不事先告知會員的做法顯示出無名小站對於會員資料和權益的不重視,
事後的客服態度更讓我確定我不再使用這家公司的服務,因此我要求退費。

<退費過程>

一開始我在哈啦無名小站留言要退費,他們隔了兩天回我一句根本不相關的話:
他們竟然問我使用上有什麼問題,隻字不提退費,我回應堅持退費後,就沒有任何下文,
他們對於我的要求直接跳過!

所以我一氣之下,就直接上消保會網站申訴。

後來我打聽到他們的服務電話,直接打過去,他們的服務小姐告訴我一經開通無法退費,
我直接告訴他絕對可以,我已經與消保官連絡而且案件已經在處理中,他就改口說退費
的問題他無法決定,他會幫我呈報上去,竟然還叫我去哈啦無名小站留言!!
我就跟他說:”我早就留言過,你們不是答非所問就是直接跳過,我現在就要把事情解決”
他一直說他不是可以決定的人她只是”客服人員”,我就叫他把電話轉去給可以決定的人,
我要親自跟他說,他竟然說他也不知道!!

盧了很久,我最後跟他說:”好,那就請你幫我呈報上層,我已經跟消保會聯絡過,
我法條也都查好了,我非常確定我絕對可以退費,我給你我的電話,請你們快跟我聯絡”
然後我給了電話,時間是接近中午的時候。

下午我看了哈啦無名小站,我的問題依然沒有回應,依照順序比我晚PO的都已經回應好
幾天了,我又打了一次電話,我除了堅持要馬上聽到回應,也直接告訴她,再不跟我聯
絡我要寄存證信函了,他依然一直盧,就是不幫我轉接。

後來我想算了,既然這樣我明天打1950給消保會看要怎麼進行法律行動好了。

結果隔天無名小站就有人打電話給我了,他說他們跟律師討論後,律師建議他們將費用
退給我,我也很不客氣的告訴她:”依法你們本來就要退!”然後他就跟我要我的匯款帳號,
現在就等他們退囉!!


六、備註:

無名小站跟Yahoo的整合,下一波就是帳號名稱的整合,若你的無名帳號在Yahoo沒有人
註冊,那恭喜你,勸你快去將他註冊起來吧!若是已經有人註冊,那你可能將遭遇一連
串的麻煩,因為Yahoo不可能犧牲自己本身的客戶去成全無名,況且yahoo的帳號是全球
性的,你無法確定yahoo那邊跟你無名一樣帳號的人是台灣人還是外國人,可能到最後
會要你改帳號或是放棄帳號。

依照無名過去的行事風格以及這次的惡劣做法,屆時極有可能你一上線就發現強制要你
改帳號的頁面,不改就無法使用,甚至是直接將你帳號做小幅更改!

反正…趕快離開無名吧!!

還有,無名小站雖然合約裡說一但開通就無法退費,但是他們的服務品質很多瑕疵,
再加上這次取消會員密碼的事發生,就絕對可以退費了!!
而且向消保會申訴真的有用,他們會發文給無名,無名就不敢亂來。




※ 發信站: 批踢踢實業坊(ptt.cc)


以下還有..
推 juicyass:客服專線是02-22365066或02-27786290~兩支都打打看,會通 07/26 01:25
推 juicyass:欲轉載之朋友不需詢問請直接盡量轉載吧!(收到好多詢問信) 07/26 01:30

7.23.2007

int - sysirq map

OAL\Bspintr.c 中 OEMInterruptHandler( )在處理interrupt 時。非即時性的,都呼叫 OALIntrTranslateIrq( ),把Hardware IRQ Number 變成 Software Irq Number。

OALIntrTranslateIrq( )利用內部的Table,查表找出Hardware IRQ對應的software Irq 值。

"表"是怎麼產生?

找一下 OALIntrTranslateIrq( )在哪裡...

在 \PLATFORM\COMMON\SRC\COMMON\INTR\BASE\map.c 中

C:\WINCE500\PLATFORM\COMMON\SRC\COMMON\INTR\BASE\sources 看出這個folder 的 target 是 oal_intr.lib。

再找哪一個folder 的sources 有link oal_intr.lib ...
在 platform 的 Kernel\Kern folder 有 link 。
在 platform 的 common\intr 也有link,但是因為 copy 到 oal 下,所以 common\intr 實際沒有在 common/dir 中。

oal folder 的target 是 oal.lib。 Kernel\Kern\sources 中 也有 link 到 oal.lib ,而且 target 是 "Program" ,所以...應該是在這裡把 oal_intr.lib 的map.c 和 oal.lib link 在一起。

所以map.c 就是關鍵:

7.19.2007

真奇怪

因為很多人都說新的Windows Live Write 變得好用了,所以試試。

真奇怪,當一切都web 化,browser化後,只有MS還努力的把user 抓回OS。

像這個Live Writer,還有最近的新聞:Outlook 將支援 Windows Live mail。

大概,他也擔心有一天一切都變成Web service後,PC上就在也不需要Windows 了吧。

試試tag : <hr>

試試貼圖..

還不行


其實還是不好用,因為都會加入一些奇怪的tag,還是直接到blogger edit 比較乾淨。

7.12.2007

Windows as a Xen guest

這篇不是Howto,更不是STEP BY STEP。

只是..

哇!已經可以在 Xen 上install Windows 了。

這裡(http://www.xensource.com/files/xen_install_windows.pdf) 還有howto 喔。

看來 我真是 out of date 太久了!

今天James說他要在Server 上裝多個Windows,用Xen。
我才知道。


大概的注意事項..
  1. Windows 要裝在 Physical Volume,所以create時要注意。
  2. 需要KDE or Gname (?)
  3. 需要SDL 和bridge-utils
  4. enable ne2000
就醬

另外還有一篇是在Etch上install XP,比較簡單,因為是用 apt-get。

7.11.2007

SMS Pdu.

Etsi (GSM 03.40 and GSM 03.38) 中規定SMS的encoding 可以有以下幾類:

  • 7 bit encoding : 最多可以包含160個characters,其中每個character只用一個或兩個byte的 7-bit data來作encoding。7 - bit encoding table 在.. http://www.dreamfabric.com/sms/default_alphabet.html
    和ASCII Code比較後,除了 0123456789. A-Z, a-z 和%$!*& ' ' 一樣外,其他都不一樣。
  • 8 bits encoding ,最多可以包含140 個字。通常用作非文字SMS,而拿來當作Data傳輸使用。
  • 16 bit encoding ,最多只可以有 70 個'字',是用來傳送Unicode text messages。 可以當作文字讀取。
另外,還規定了傳送的方式(Mode)
  • Text Mode
  • Pdu Mode
Pdu (Protocol Description Unit)

Pdu 封包中,除了內文外,還包含其他的information,像
  • Sender,
  • SMS service center
  • time stamp
傳送的data是以"hexa-decimal" or "decimal semi-octents"。

這個encoding 有點麻煩喔,採用 7 bit encoding 是為了減少資料量。所以一個"字"就佔不滿一個byte,多的bit,就拿下一個"字"的bit,拿法是..
從下一個"字"中 ,從後算起,還沒被拿走的bit 拿起..
這一篇文章,有很好的示範.. http://www.dreamfabric.com/sms/hello.html

7.09.2007

DisablePagingExecutive. - use Physical Memory

新買了1G的記憶體,所以follow pchome的說明,把paging 關掉。
用Regedit,把..
[ HKLM ] - [System] - [Current Control Set] - [ Control ] - [ Session Manager ] - [ Memory Management] 的 ' DisablePagingExecutive ' 這一個Item由 ' 0 ' 改為 ' 1 ' 就可以了。

* 這個item 是說要不要disable Paging。所以 ' 1 ' 是 disable。

將來如有需要,再把他改回 ' 0 ' 就可以了。