2009年12月31日 星期四

linux usb 詳解

http://book.51cto.com/art/200811/96183.htm

USB 講座

http://chamberplus.myweb.hinet.net/usb_diy1.htm

2009年12月28日 星期一

window usb struct

http://www.eetop.cn/blog/html/97/24597-1390.html
http://www.eetop.cn/blog/html/97/24597-1391.html
http://www.eetop.cn/blog/html/97/24597-1392.html

FreeBSD ehci source code

http://fxr.watson.org/fxr/source/pc/usbehci.c?v=PLAN9

2009年12月27日 星期日

2009年12月26日 星期六

外包接案網站介紹

像一些付費外包接案網站,價錢大約半年500-3800不等
個人soho要跟公司團隊競爭難免比較困難,許多案子被公司行號接走再轉包出去也是大有人在
初成為soho建議可以從收費少的接案開始,累積自己實力之後在加強自己優勢
否則白白燒錢後卻得不到成效就十分鬱悶啦。

●JCase外包銀行 http://www.jcase.com.tw
前身為AboutCase委外市集網站

●104專案外包網 http://www.104case.com.tw

●愛蘇活網 http://www.isoho.com.tw

●MyCase專案委外平台 http://mycase.myjob.com.tw

●CJob人力網 http://case.comcareer.com.tw/

●藍色小舖 http://www.blueshop.com.tw
是一個專業程式下載討論社群網站,從幾年前純ASP程式下載到現在發展各類技術文件全方位網站

●程式設計俱樂部 http://www.programmer-club.com
由程式設計師/系統分析師/資訊專業人員組成的社群網站,也算是國內程式設計高手常瀏覽的網站
裡面技術非常豐富,有特別設立外包接案專區單元,不過當然是偏向程式設計外包案件摟。

●黑秀網 http://www.heyshow.com
其他像是國內相當知名的設計類網站,講黑話的討論區各類資源也相當豐富。

●設計魔力 http://twdesign.net

●奇集集kijiji免費分類廣告 http://www.kijiji.com.tw
很多人都會去這網站搜尋租屋等等,其實這網站也可以刊登個人SOHO履歷
在外包工作的分類裡也可以搜尋外包案件,免費就能得到發案者的聯絡資料。

●政府電子採購網  http://web.pcc.gov.tw
提供政府單位案件查詢、線上押標金、線上投標等機制,若公司稍具規模或有足夠資金與人力,可以考慮跟政府做生意喔

2009年12月25日 星期五

fudan_abc and im_tom的專欄 (usb ehci 詳解)

fudan_abc
http://blog.csdn.net/fudan_abc/category/338973.aspx
im_tom
http://blog.csdn.net/lm_tom/archive/2007/09/09/1778031.aspx

2009年12月24日 星期四

Linux USB指南

http://www.gentoo.org/doc/zh_cn/usb-guide.xml

EHCI

usb 2.0定義了低速(ls),全速(fs),高速(hs)傳輸。EHCI僅僅支持高速傳輸,所以它必須還要有一個companion HC,如(UHCI)來支持低速和全速設備,情況時這樣的:
1), fs/ls 設備插入到root hub port,會由companion HC(uhci/ohci)發現並管理設備;
2),fs/ls 設備插入到usb 2.0 hub(not root hub),那麼由ehci 通過split transaction和transanction translation(tt)支持fs/ls 設備。
比如,當一個usb設備插入root hub port時,先要做一件routing的事情。所有的root hub port默認是被EHCI佔有的,所以,EHCI和插入的usb設備通信,看是不是hs設備,如果是好說。如果不是,EHCI就放棄這個port的佔有 權,讓給companion HC(uhci/ohci)去管理。

UHCI,OHCI,EHCI差異

USB(Universal Serial Bus)通用串列匯流排:USB1.1規格支援兩種速率:低速(low speed)1.5Mbps和全速(full speed)12Mbps.
新的USB2.0規格除了支援原有的兩種速度外,還而外支援高速(high speed)480Mbps。

    USB host controller(USB主控器)必定是下列3種規格:
  1. UHCI : Intel公司提倡,UHCI線路比OHCI線路簡單多了,但是需要比較複雜的驅動程式,對CPU負擔也微重了些,UHCI採用I/O-mapped I/O方式(CPU使用I/O指令來存取USB controller),採用的廠商有Intel,VIA。
    在UHCI 中一個SOF 會出現一個Setup Token。
  2. OHCI:Compaq(康柏)公司主導,採用Memory-mapped I/O(CPU使用記憶體指令來存取USB controller),採用的廠商有Compaq,iMace,OPTi,SiS,Ali。
    在OHCI 中一個SOF 會可能出現三個Setup token。
  3. EHCI:USB規格,相容於UHCI,OHCI,只有USB2.0(EHCI)才提供高速480Mbps傳輸效率。

2009年12月21日 星期一

Vim color

  1. 下載 COLOR_SCHEME.vim
  2. mkdir ~/.vim/colors/
  3. mv COLOR_SCHEME.vim ~/.vim/colors/
  4. vim ~/.vimrc # 加入下述內容
    colorscheme COLOR_SCHEME

  5. 註1: .vimrc 要記得加 set t_Co=256 來支援 256 色的環境, 才不會覺得跟預覽圖不一樣.
  6. 註2: syntax on ...

Ubuntu samba 設定

【第一步】
叫出終端機,鍵入以下的指令:(以下數字後面的文字為說明)
1.安裝samba
sudo apt-get install samba

2.先停止服務,準備設定設定檔

sudo /etc/init.d/samba stop

3.設定 samba 設定檔

sudo gedit /etc/samba/smb.conf

4.設定分享資料夾,請在smb.conf的尾端加入以下的內容

[SHARE]
path = /home/你自己名稱/shared    ;分享路徑
browseable = yes            ;是否可瀏覽
read only = no              ;唯讀
create mask = 0644          ;檔案遮罩
directory mask = 0755       ;資料夾遮罩

5.啟動 samba 服務

sudo /etc/init.d/samba start

6.建立帳號密碼

sudo smbpasswd -a <帳號>

※若想直接分享,不需要設定每位使用者的帳號密碼,那麼在 smb.conf 中 security 設定更改成如下:

;security = share

【第二步】
  1. 在桌面上,滑鼠右鍵點選/home/你自己名稱/shared,選擇【共享選項】。
  2. 依照您的需求,自行決定。也可以都打勾!
  3. 再點選【新增分享】。

2009年12月1日 星期二

Timer tutorial include prescalers

timer tutorial (incl prescalers)

Delays@
Andrew Warren [fastfwd at ix.netcom.com] of Fast Forward Engineering San Diego, California says:
timer-0 has four components: The clock input (either from the TMR0 pin or from the internal instruction clock), the TMR0 prescaler, the TMR0 register, and the TMR0 interrupt flags (GIE, T0IE, and T0IF).

CLOCK INPUT:

You'll probably use the internal instruction clock as your TMR0 input; I'll assume that your PIC is running at 4 MHz. Since there's an internal divide-by-4 between the oscillator frequency and the instruction clock, this means that instruction clocks occur at a 1 MHz rate.

prescaler:

The TMR0 prescaler is set (via 4 bits in the OPTION register) to divide-by-1, -2, -4, -8, -16, -32, -64, -128, or -256. The TMR0 input clock (1 MHz in your case) is passed to the prescaler, whose divided-down output is then fed to the TMR0 register.
For example, if the TMR0 prescaler is set to divide-by-4 and the PIC is running at 4 MHz, the prescaler will send a 250 KHz clock to the TMR0 register.

TMR0 REGISTER:

The TMR0 register can be preloaded with any 8-bit value that you like.
Each clock pulse from the prescaler increments the contents of the TMR0 register. When the value in the TMR0 register rolls over from 0xFF to 0x00, the T0IF flag is set (the TMR0 register continues to be incremented on every pulse from the prescaler, though).

INTERRUPT FLAGS:

If the GIE and T0IE flags are set when the T0IF flag is set, an interrupt is generated (the GIE bit is automatically cleared (to temporarily prevent further interrupts while your interrupt routine is executing), and the PIC jumps to the "interrupt vector" at location 0x04. Your interrupt-service routine at that location should check the T0IF flag to determine the source of the interrupt, then must clear the T0IF flag to prevent the PIC from immediately jumping back to the interrupt routine when interrupts are re-enabled.
At this point in the interrupt routine, you can re-load the RTCC with any appropriate value.
When you're finished handling the interrupt, your code should execute a RETFIE instruction, which will automatically set the GIE bit to re-enable interrupts and return to your main program.
Luis F says:
If you want the delay in seconds:
Delay = (256 - InitTMR0 * prescaler)
            -----------------------------------------
                    Frequency / 4
Or if you want the value to put in TMR0 to get a determinate DELAY
InitTMR0 = 256 - ( DELAY * Frequency ) / ( 4* prescaler)

2009年11月28日 星期六

c language standard library function


Reference website: http://www.cplusplus.com/reference/clibrary/ 
Reference: "Embedded Linux, C-language programming practice" 
In fact, in reference to web pages, you can already find all the C language standard library functions. Here I only list what I learned: 
  C-set of the standard library functions are: 
     : the standard set of input and output functions. 
     : a set of function determining character type (whether upper case, numbers, spaces)

     : a set of function Operating string. 
     : a set of mathematical applications related functions. 
     : tool set, including the type conversion and some system functions. 
     : a set of additional assertion functions. 
     : variable parameters, tool kit. such as the printf function will use this package. 
     : a set of function supporting jump feature

     : a set of processing interrupts. 
     :a set of function dealing with the date and time
     : integer type maximum and minimum set.

     : maximum and minimum set of floating-point type.

1. Standard formal input and output class function 
    Header files are involved in stdio.h and stdarg.h 
   * scanf function: Format input string 
   * printf functions: formatting output strings 
   * putchar function: the output characters to the standard output 
   * getchar function: get character from standard input 
   * putc function: output characters to the file 
   * getc function: get characters from a file 
           while ((c = getchar ()! = EOF)) putchar (c) 
           c = getc (pFile) 
           getchar () is equivalent to getc (stdin) 
   * gets function: get the string 
   * puts the function: output the specified string 
   * ungetc function: the return of characters to write


2. Character processing and conversion functions 
   * sprintf function: formatted output string to a buffer 
           sprintf (s, "% d", 123) 
           sprintf (s, "% 08X", 456); turn 16 hex 
           sprintf (s, "% 10.3f", 3.1434) 
   * strcat and strncat functions: string concatenation 
          char * strncat (char * dest, const char * src, size_t n) 
   * strcpy and strncpy functions: string copying 
          char strncpy (char * dest, const char * src, size_t maxlen) 
   * strcmp and strncmp functions: String Comparison 
           int strcmp (const char * s1, const char * s2) 
           s1> s2 return 1 
           s1 = s2 return 0 
           s1
   * strlen function: Get the string length of the 
   * strchr and strrchr function: Character / String location 
           strchar: search a character position of first occurrence 
           strrchr: search a character position of last occurrence 
   * strstr function: string search 
   * strupr and strlwr function: to convert the letters 
   * strdup and strndup function: string copying 
           char * strdup (const char * s) 
           The string s to copy to the specified memory cell


3. Math class functions counting 
    div acos atan cos tan cosh exp frexp ldexp log modf pow sqrt ceil abs floor


4. Data structures and algorithms class functions 
     * bsearch function: binary search 
     * lfind function: linear search 
     * lsearch function: linear search 
     * qsort function: the use of ordered array of quick sort method 
     * rand function: generate random number


5. File I / O operation class correlation function 
     * fopen function: open file 
     * fclose function: close file 
     * fgetc function: read a character from a file 
            fp = fopen ( "exit", "r") 
            while ((c = fgetc (fp))! = EOF) 
     * fputc function: to a specified character is written to the file stream 
     * fgets function: read a string from a file 
     * fputs function: to a specified string into the document
     * rewind function: Reset the file position of the file stream to read and write at the beginning of 
     * ftell function: get the file stream to read position 
     * fseek function: get the file stream to read position 
     * fwrite function: to build the file to write to the file stream 
     * fread function: read data from the file stream 
     * fgetpos function: get the file location 
                The stream's current location is recorded in the * position for the subsequent fsetpos () call using the 
     * fsetpos function: Set File Location


6. Utility functions 
     * assert function: diagnostic procedures 
     * setjmp function: to save call

C language extensions library function


Reference: "Embedded Linux, C-language programming practice" 

1. File I / O operations functions 

   * open function: open file 
          int open (const char * pathname, int flags) 

   * close function: close file 

   * read function: read the file 
          ssize_t read (int_fd, void * buf, size_t count) 
            transfer bytes of count number into point buf
         

   * write function: write file 
          ssize_t write (int fd, const void * buf, size_t count) 
          write bytes of count number into file(fd) with beginning of point buf in the memory 

   * lseek Function: File Positioning 
          off_t lseek (int fildes, off_t offset, int whence); 
          retuen the current position of reading and writing 

   * flock function: lock file 
          int flock (int fd, int operation) 

   * mmap function and munmap functions: memory-mapped 
          int munmap (void * start, size_t length) 
         map the contents of a file into memory, to write or read this memory region is the direct access to to the content of the document. 

   * create a function: to create a new file 
          int create (const char * pathname, mode_t mode) 

   * fcntl function: to change the file attributes which has been opened 

          int fcntl (int fields, int cmd, int arg) 
          If success,return the implementation of the new descriptor, otherwise returns -1 

2. the function of related file permissions

   * access functions: to determine whether access to the file permissions 
          int access (const char * pathname, int mode) 
          if (0 == access (argv [1], W_OK)) R_OK X_OK F_OK 

   * chown function and fchown function: to change the file owner of the 
          int fchown (int fd, uid_t owner, gid_t group) 

   * chmod function and fchmod function: to change the permissions 
         int fchmod (int fildes, mode_t mode) 

   * unlink function: delete the file 

3. User group manipulation functions 

   * getegid function and setegid function: get / set the effective group ID 
         gid_t gete (gid_t egid) 

   * geteuid function and seteuid function: get / set the real user ID 

         uid_t getuid (void) 

  4. Signaling Function 

    * kill function: to send a signal to the specified process

         int kill (pid_t pid, int sig) 

    * rais function: signaling 

         int raise (int sig) 

    * alarm function: Set the timer 

         unsigned int alarm (unsigned int seconds) 

    * signal function: Signal Installation Function 
         sighandler_t signal (int signum, sighandler_t handler) 

5. The process of dealing with the function 

    * getpid function and getppid function: to obtain the process ID and the parent process ID 
         pid_t getpid (void) 
         pid_t getppid (void) 

    * fork function: the establishment of child process 
         pid_t fork (void) 
         The parent process has been the return value is the child process ID, while the child process returns 0 

    * sleep function: Let the process was suspended for a period of time 
         unsigned int sleep (unsigned int seconds) 

    * exec function: find the executable file 

    * _exit function: the end of the process of implementation of the

function pointer


Reference: "Embedded Linux, C-language programming practice" 

1. The concept of function pointers: 
   In the C language: the nature of the pointer is a memory address, function pointer is a pointer to a function of the code in the code segment address of the pointer. 
   For the function, its address and function name represents the same meaning 
   In the C language programming, data structures and algorithms are two basic elements, through a function pointer, the algorithm can be embedded into data structure. 

  

2. The usage of function pointers 

  
*the basic usage
    int add (int a, int b) 
    {....} 
    int sub (int a, int b) 
    {....} 
    int main ()
    ( 
      int (* pf) (int, int); 
      pf = add; 
      result = pf (100,200); 
      pf = sub; 
      result = pf (100,200); 
     )


   
* Type conversion: 
   int add (int a, int b) 
    {....} 
    int sub (int a, int b) 
    {....} 
    int main () 
    ( 
      void * pf; 
      pf = add; 
      result = (int (*) (int, int) pf) (100,200); 
      pf = sub; 
      result = (int (*) (int, int) pf) (100,200); 
     )


   
 * Function pointer type definition 
   typedef int (* fun_t) (int, int); 
   fun_t pf; 
   pf = add; 
   result = pf (100,200);


    
* Function pointer as a structure member 
struct source 

   int a; 
   int b; 
   fun_t operation; / / equivalent to int * fun_t (int, int); 
); 
int main (int argc, char * argv []) 

   struct source data; 
   int result; 
   data.a = 200; 
  
 data.b = 100; 
   data.operation = add; 
   result = data.operation (data.a, data.b); 


   
* Function pointer being as a parameters of the function 
int calculate (int a, int b, fun_t operation) 

   int result; 
   result = operation (a, b); 
   return result; 

  int main (int argc, char * argv []) 

   int a, b, result; 
   a = 200; 
   b = 100; 
   result = calculate (a, b, add); 
   ) 

   
* Function pointer as the function return value 
fun_t getoperation (char a) 

   fun_t result; 
   switch (a) 
  ( 
   case "+"; 
       result = add; 
       break; 
   case "-"; 
       result = sub; 
       break; 
   ) 
    return result; 

int main (int argc, char * argv []) 

   int a, b, result; 
   char oper; 
  
 a = 200; 
   b = 100; 
   oper ="+"; 
   result = getoperation (oper) (a, b); 
)


 
  * Array of function pointers 
enum ( 
       oper_add = 0, 
       oper_sub 

static const fun_t oper_table [oper_num] = 

   add, 
   sub 

int main (int argc, char * argv []) 

   int a, b, result; 
   a = 200; 
   b = 100; 
   result = oper_table [oper_add] (a, b); 
)

Dynamic memory Heap and Stack


Reference: "Embedded Linux, C-language programming practice" 

1. The use of program memory area 

   Storage area is divided into: static and dynamic 

                 Static: read-only data area (RO DATA), has been initialized to read and write data area (RW DATA), an uninitialized read-write data area (BSS:
Block Started by Symbol


                 dynamic: heap Memory (heap) and stack memory (stack) 

   Heap memory is from low address to high address allocation, stack memory is from high address to low address allocation 

2.C program stack space usage 

   In the C language program, the stack space is managed by the compiler, can be reflected in the program stack space using the example of parameter passing, return values, and automatic variable is the use of space. 

3.C program heap space usage 

   In the C language program, the heap memory allocation and release is done by calling the library function, and their use need to include standard library files: 
    # include
 

  There are four functions to achieve the heap memory allocation and release: 
     void * malloc (size_t size) to allocate memory space 
     void free (void * ptr) free memory space 
     void * calloc (size_t nmemb, size_t size) to allocate memory space 
     void * realloc (void * ptr, size_t size) to re-allocate memory space 

4. Heap memory and stack memory usage comparison 
    The swap of the most classic examples: 
   void swap (int a, int b) 
   ( 
     int tmp; 
     tmp = b; 
     b = a; 
     a = tmp; 
     return; 
   ) 

    This swap can not be achieved, because, swap function is called when you create a new stack space, when the stack upon return, the stack area has been released. Therefore, we must use the pointer. 

   I seriously appreciate the two examples: 

typedef struct _S100 



   char string [100]; 

) S100; 

  

void fun_para1 (S100 a) 



printf ( "From para:% s \ n", a.string); 

strcpy (a.string ,"-----"); 

printf ( "fun_para1 change:% s \ n", a.string); 

return; 



void test_fun_para1 (void) 



S100 a; 

strcpy (a.string, "+++++") 

fun_para1 (a); 

printf ( "after fun_para1 return:% s \ n", a.string); 

return; 



Running Results: 

From para :+++++ 

fun_para1 change: ----- 

after fun_para1 return :+++++ 

  

void fun_para3 (char a [100]) 



strcpy (a ,"-----"); 

printf ( "fun_para1 change:% s \ n", a); 

retrun; 



void test_fun_para3 (void) 



char a [100]; 

strcpy (a ,"+++++"); 

fun_para3 (a); 

printf ( "after fun_para3 return:% s \ n", a); 

return; 



Running Results: 

from para :+++++ 

fun_para1 change :----- 

after fun_para3 return :----- 

  

From the run results, such a conclusion can be drawn:

when structure being used as parameters in function, the entire structure has been pushed onto the stack memory, just like a variable. 
when array being used as a parameter in function, it will be handled as a pointer

2009年11月25日 星期三

Intel Canmore嵌入式平台可以基於多種方式啟動

原文地址:http://samzhen.blogspot.com/2008/11/intel-ce3110canmore.html
Intel Canmore嵌入式平台可以基於多種方式啟動。


先介紹背景知識。
Intel CE3110 啟動時,首先去執行Non flash上的一個稱為CEFDK的程序。CEFDK做最初的初始化動作。然後將執行權交給redboot. redboot則將kernel和rootfs準備好並將執行權交給redboot.


CEFDK, redboot, kernel, rootfs放在不同的位置上,所以Canmore可以有多種啟動方式。


方式1:
CEFDK, redboot,kernel,rootfs全部放入Non flash.
這個方式有個前提, 因為Non flash非常小。 所以 kernel,rootfs必須非常基礎,非常小的。其實做不了什麼事。基本很少使用這種方式。


方式2:
CEFDK,redboot放在Non flash. Kernel放在tftp根目錄。rootfs放在nfs目錄。
這種方式常用來在開發階段使用。因為kernel,rootfs可以很容易的修改。


方式3:
CEFDK,redboot放在Non flash中,Kernel, rootfs放在SATA harddisk中。
這種方式是STB最終產品模式。


現在具體介紹不同方式的做法:


CEFDK在Canmore出廠時,就已經燒入到Non Flash中。所以需要做的就是把redboot, kernel,rootfs放到相應的位置。


方式2:
CEFDK,redboot放在Non flash. Kernel放在tftp根目錄。rootfs放在nfs目錄。
1.首先燒入redboot.
重新啟動Canmore時,按住空格鍵,則進入CEFDK界面:
shell>
shell> ymodem 0x200000 0
在Transfer->send File 中選擇ymodem. 並把redboot_flashboot.bin選中。
傳輸完成後,只是將image放到內存.還需要燒到Non flash中去。
shell>expflash burnFlash 0x200000 0x100000 0x20000
註:redboot_flashboot.bin表示是:這個版本的redboot是放在Non flash中的。
重新啟動Canmore,按ctrl+c.則進入redboot界面:
RedBoot>


2.將kernel放到tftpboot中,將rootfs放到NFS目錄中。
將kernel文件,bzImage放到server的/tftpboot中。(tftp要安裝好)
將rootfs目錄--fsroot放到NFS允許使用的目錄中。(nfs服務要安裝好 /etc/exports要允許Canmore IP地址使用這個目錄)


3.在redboot中,設置kernel,rootfs的放置地點。
RedBoot> fconfig


>> load -v -r -m tftp -h 172.16.1.61 -b 0x200000 bzImage
>> exec -b 0x200000 -l 0x300000 -c "console=ttyS0,115200 root=/dev/nfs rw nfsroot=172.16.1.61:/home/sam/Intel/Canmore/fsroot_canmore_1073_new ip=dhcp mem=exactmap memmap=640k@0 memmap=95M@1M"
>>
Boot script timeout (1000ms resolution): 2Use BOOTP for network configuration: trueDefault server IP address: 172.16.1.70Console baud rate: 115200GDB connection port: 9000Force console for special debug messages: falseNetwork debug at boot time: falseUpdate RedBoot non-volatile configuration - continue (y/n)? y


之後重新啟動,則redboot從172.16.1.61的tftpboot中拿kernel.
把172.16.1.61:/home/sam/Intel/Canmore/fsroot_canmore_1073_new 當作rootfs.






方式3: CEFDK,redboot放在Non flash中,Kernel, rootfs放在SATA harddisk中。
3.1.準備SATA harddisk.
3.1.1分區:
將SATA硬盤連接到開發機Linux上 ,而不是Canmore Linux上。
#fdisk -l


注意:/dev/sdb是4G固態硬盤。/dev/sda是Sam插入的40G SATA硬盤。
Sam想把SATA硬盤分2個區。第一個區用來放置redboot.第二個分區用來放kernel+rootfs.
注意:
#fdisk /dev/sda


Command (m for help): n
Command action e extended p primary partition (1-4)p
Partition number (1-4): 1
First cylinder (1-1022, default 1): Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1022, default 1022): 1


Command (m for help): n
Command action e extended p primary partition (1-4)p
Partition number (1-4): 2
First cylinder (2-1022, default 2): Using default value 2
Last cylinder or +size or +sizeM or +sizeK (2-1022, default 1022): +1024M


Command (m for help): a
Partition number (1-4): 1
Command (m for help): w
The partition table has been altered!


n:新建partition.
p:邏輯分區
1,2:分區號。
First cylinder :第一個扇區號
Last cylinder or +size or +sizeM or +sizeK :最後一個扇區號.或者用+xxxM.


a: 制定boot flag.
w:執行以上動作。


3.1.2格式化/dev/sda2
#mkfs.ext3 /dev/sda2




3.2:放置redboot.bin到第一個分區。
首先使用tftpboot+nfs方式啟動。
# dd conv=sync if=redboot.bin of=/dev/sda1 [注1]
224+1 records in
225+0 records out


3.3:放置kernel+rootfs到第二個分區。
# mkdir disk
# mount /dev/sda2 /disk/
#cp bzImage /disk
#cd fsroot
# cp * -rf /disk/


3.4:設置redboot:(Sam認為應該是Non Flash中的redboot)
先查看當前Redboot設置。
Redboot> fconfig -l


寫Redboot:
Redboot> fconfig
>> load -v -r -m disk -b 0x200000 hda2:bzImage
>> exec -b 0x200000 -l 0x300000 -c "console=ttyS0,115200 root=/dev/sda2 rw mem=exactmap memmap=640K@0 memmap=95M@1M"
>>


重新啟動。OK




注1:
Linux命令dd:
dd: convert and copy a file.轉換和copy 文件。
conv= : convert the file as per the comma separated symbol list. 將文件轉化為指定的格式
其中:conv = sync:把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊。
if=:read from FILE instead of stdin。輸入
of=:write to FILE instead of stdout。輸出
# dd conv=sync if=redboot.bin of=/dev/sda1
所以,這句話:將redboot.bin放入/dev/sda1

2009年11月22日 星期日

BAT 批次檔(下


注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令語法會稍有不同,請用choice /?查看用法。
choice的命令語法(該語法為Windows 2003中choice命令的語法,其他版本的choice的命令語法與此大同小異):
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
該工具允許用戶從選擇列表選擇一個專案並返回所選項目的索引。

參數列表:
/C choices 指定要創建的選項列表。默認列表是 "YN"。

/N 在提示符中隱藏選項列表。提示前面的消息得到顯示,
選項依舊處於啟用狀態。

/CS 允許選擇分大小寫的選項。在默認情況下,這個工具
是不分大小寫的。

/T timeout 做出默認選擇之前,暫停的秒數。可接受的值是從 0
到 9999。如果指定了 0,就不會有暫停,默認選項
會得到選擇。

/D choice 在 nnnn 秒之後指定默認選項。字元必須在用 /C 選
項指定的一組選擇中; 同時,必須用 /T 指定 nnnn。

/M text 指定提示之前要顯示的消息。如果沒有指定,工具只
顯示提示。

/? 顯示幫助消息。
注意:
ERRORLEVEL 環境變數被設定為從選擇集選擇的鍵索引。列出的第一個選
擇返回 1,第二個選擇返回 2,等等。如果用戶按的鍵不是有效的選擇,
該工具會發出警告響聲。如果該工具檢測到錯誤狀態,它會返回 255 的
ERRORLEVEL 值。如果用戶按 Ctrl+Break 或 Ctrl+C 鍵,該工具會返回 0
的 ERRORLEVEL 值。在一個批程式中使用 ERRORLEVEL 參數時,將參數降
序排列。

示例:
CHOICE /?
CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "選項 1 請選擇 a,選項 2 請選擇 b。"
CHOICE /C ab /N /M "選項 1 請選擇 a,選項 2 請選擇 b。"

==== willsort 編注 ===============================
我列出win98下choice的用法説明, 已資區分

Waits for the user to choose one of a set of choices.
等待用戶選擇一組待選字元中的一個

CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
/C[:]choices Specifies allowable keys. Default is YN
指定允許的按鍵(待選字元), 默認為YN
/N Do not display choices and ? at end of prompt string.
不顯示提示字串中的問號和待選字元
/S Treat choice keys as case sensitive.
處理待選字元時大小寫敏感
/T[:]c,nn Default choice to c after nn seconds
在 nn 秒後默認選擇 c
text Prompt string to display
要顯示的提示字串
ERRORLEVEL is set to offset of key user presses in choices.
ERRORLEVEL 被設定為用戶鍵入的字元在待選字元中的偏移值
如果我執行命令:CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"
螢幕上會顯示:
確認請按 Y,否請按 N,或者取消請按 C。 [Y,N,C]?

例:test.bat的內容如下(注意,用if errorlevel判斷返回值時,要按返回值從高到低排列):
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errorlevel 1 goto defrag

:defrag
c:\dos\defrag
goto end

:mem
mem
goto end

:end
echo good bye

此批次處理執行後,將顯示"defrag,mem,end[D,M,E]?" ,用戶可選擇d m e ,然後if語句根據用戶的選擇作出判斷,d表示執行標號為defrag的程式段,m表示執行標號為mem的程式段,e表示執行標號為end的程式段,每個程式段最後都以goto end將程式跳到end標號處,然後程式將顯示good bye,批次處理執行結束。
四、for 迴圈命令,只要條件符合,它將多次執行同一命令。
語法:
對一組檔中的每一個檔執行某個特定命令。

FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組檔。可以使用通配符。
command 指定對每個檔執行的命令。
command-parameters
為特定命令指定參數或命令行開關。

例如一個批次檔案中有一行:
for %%c in (*.bat *.txt) do type %%c

則該命令行會顯示當前目錄下所有以bat和txt為副檔名的檔的內容。
==== willsort 編注 =====================================================
需要指出的是, 當()中的字串並非單個或多個檔案名時, 它將單純被當作字串替換, 這個特性再加上()中可以嵌入多個字串的特性, 很明顯 for 可以被看作一種遍曆型迴圈.
當然, 在 nt/2000/xp/2003 系列的命令行環境中, for 被賦予了更多的特性, 使之可以分析命令輸出或者檔中的字串, 也有很多開關被用於擴展了檔替換功能.
========================================================================

批次處理示例
1. IF-EXIST
1) 首先用記事本在C:\建立一個test1.bat批次檔案,檔內容如下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist

然後執行它:
C:\>TEST1.BAT

如果C:\存在AUTOEXEC.BAT檔,那麼它的內容就會被顯示出來,如果不存在,批次處理就會提示你該檔不存在。
2) 接著再建立一個test2.bat檔,內容如下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist

執行:
C:\>TEST2 AUTOEXEC.BAT
該命令執行結果同上。

說明:
(1) IF EXIST 是用來測試檔是否存在的,格式為
IF EXIST [路徑+檔案名] 命令
(2) test2.bat檔中的%1是參數,DOS允許傳遞9個批參數資訊給批次檔案,分別為%1~%9(%0表示test2命令本身) ,這有點象編程中的實參和形參的關係,%1是形參,AUTOEXEC.BAT是實參。

==== willsort 編注 =====================================================
DOS沒有 "允許傳遞9個批參數資訊" 的限制, 參數的個數只會受到命令行長度和所調用命令處理能力的限制. 但是, 我們在批次處理程式中, 在同一時刻只能同時引用10個參數, 因為 DOS只給出了 %0~%9這十個參數引用符.
========================================================================

3) 更進一步的,建立一個名為TEST3.BAT的檔,內容如下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN

如果執行:
C:\>TEST3 A B C
螢幕上會顯示:
XIAO
TIAN
XIN

如果執行:
C:\>TEST3 A B
螢幕上會顯示
XIAO
TIAN

在這個命令執行過程中,DOS會將一個空字串指定給參數%3。
2、IF-ERRORLEVEL
建立TEST4.BAT,內容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 1 ECHO 檔拷貝失敗
IF ERRORLEVEL 0 ECHO 成功拷貝檔

然後執行檔:
C:\>TEST4

如果檔拷貝成功,螢幕就會顯示"成功拷貝檔",否則就會顯示"檔拷貝失敗"。
IF ERRORLEVEL 是用來測試它的上一個DOS命令的返回值的,注意只是上一個命令的返回值,而且返回值必須依照從大到小次序順序判斷。
因此下面的批次檔案是錯誤的:

@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷貝檔
IF ERRORLEVEL 1 ECHO 未找到拷貝檔
IF ERRORLEVEL 2 ECHO 用戶通過ctrl-c中止拷貝操作
IF ERRORLEVEL 3 ECHO 預置錯誤阻止檔拷貝操作
IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤

無論拷貝是否成功,後面的:
未找到拷貝檔
用戶通過ctrl-c中止拷貝操作
預置錯誤阻止檔拷貝操作
拷貝過程中寫盤錯誤

都將顯示出來。
以下就是幾個常用命令的返回值及其代表的意義:
backup
0 備份成功
1 未找到備份檔案
2 檔共用衝突阻止備份完成
3 用戶用ctrl-c中止備份
4 由於致命的錯誤使備份操作中止

diskcomp
0 盤比較相同
1 盤比較不同
2 用戶通過ctrl-c中止比較操作
3 由於致命的錯誤使比較操作中止
4 預置錯誤中止比較

diskcopy
0 盤拷貝操作成功
1 非致命盤讀/寫錯
2 用戶通過ctrl-c結束拷貝操作
3 因致命的處理錯誤使盤拷貝中止
4 預置錯誤阻止拷貝操作

format
0 格式化成功
3 用戶通過ctrl-c中止格式化處理
4 因致命的處理錯誤使格式化中止
5 在提示"proceed with format(y/n)?"下用戶鍵入n結束

xcopy
0 成功拷貝檔
1 未找到拷貝檔
2 用戶通過ctrl-c中止拷貝操作
4 預置錯誤阻止檔拷貝操作
5 拷貝過程中寫盤錯誤

chkdsk
0 未找到錯誤
255 找到一個或多個錯誤

choice
0 用戶按下ctrl+c/break
1 用戶按下第一個鍵
255 檢測到命令行中的錯誤條件
其他 用戶按下的有效字元在列表中的位置

defrag
0 碎片壓縮成功
1 出現內部錯誤
2 磁片上沒有空簇。要執行DEFRAG,至少要有一個空簇
3 用戶用Ctrl+C退出了DEFRAG
4 出現一般性錯誤
5 DEFRAG在讀簇時遇到錯誤
6 DEFRAG在寫簇時遇到錯誤
7 分配空間有錯
8 記憶體錯
9 沒有足夠空間來壓縮磁片碎片

deltree
0 成功地刪除一個目錄

diskcomp
0 兩盤相同
1 發現不同
2 按CTRL+C 終止了比較
3 出現嚴重錯誤
4 出現初始化錯誤

find
0 查找成功且至少找到了一個匹配的字串
1 查找成功但沒找到匹配的字串
2 查找中出現了錯誤

keyb
0 鍵盤定義檔裝入成功
1 使用了非法的鍵盤代碼,字元集或語法
2 鍵盤定義檔壞或未找到
4 鍵盤、監視器通訊時出錯
5 要求的字元集未準備好

move
0 成功地移動了指定的檔
1 發生了錯誤

msav /N
86 檢查到了病毒

replace
0 REPLACE成功地替換或加入了文件
1 MS-DOS版本和REPLACE不相容
2 REPLACE找不到原始檔案
3 REPLACE找不到源路徑或目標路徑
5 不能存取要替換的檔
8 記憶體不夠無法執行REPLACE
11 命令行句法錯誤

restore
0 RESTORE成功地恢復了檔
1 RESTORE找不到要恢復的檔
3 用戶按CTRL+C終止恢復過程
4 RESTORE因錯誤而終止

scandisk
0 ScanDisk在它檢查的驅動器上未檢測到任何錯誤
1 由於命令行的語法不對,不能執行ScanDisk
2 由於記憶體用盡或發生內部錯誤,ScanDisk意外終止
3 用戶讓ScanDisk中途退出
4 進行盤面掃描時,用戶決定提前退出
254 ScanDisk找到磁片故障並已全部校正
255 ScanDisk找到磁片故障,但未能全部校正

setver
0 SETVER成功地完成了任務
1 用戶指定了一個無效的命令開關
2 用戶指定了一個非法的檔案名
3 沒有足夠的系統記憶體來執行命令
4 用戶指定了一個非法的版本號格式
5 SETVER在版本表中未找到指定的項
6 SETVER未找到SETVER.EXE文件
7 用戶指定了一個非法的驅動器
8 用戶指定了太多的命令行參數
9 SETVER檢測到丟失了命令行參數
10 在讀SETVER.EXE檔時,SETVER檢測到發生錯誤
11 SETVER.EXE文件損壞
12 指定的SETVER.EXE檔不支援版本表
13 版本表中沒有足夠的空間存放新的項
14 在寫SETVER.EXE檔時SETVER檢測到發生錯誤
========================================================================

3、IF STRING1 == STRING2
建立TEST5.BAT,檔內容如下:
@echo off
IF "%1" == "A" FORMAT A:

執行:
C:\>TEST5 A
螢幕上就出現是否將A:盤格式化的內容。

注意:為了防止參數為空的情況,一般會將字串用雙引號(或者其他符號,注意不能使用保留符號)括起來。
如:if [%1]==[A] 或者 if %1*==A*

5、GOTO
建立TEST6.BAT,檔內容如下:
@ECHO OFF
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:\AUTOEXEC.BAT D:\
:_DONE

注意:
(1) 標號前是ASCII字元的冒號":",冒號與標號之間不能有空格。
(2) 標號的命名規則與檔案名的命名規則相同。
(3) DOS支援最長八位元字元的標號,當無法區別兩個標號時,將跳轉至最近的一個標號。

==== willsort 編注 =====================================================
1)標號也稱作標籤(label)
2)標籤不能以大多數的非字母數位字元開始, 而檔案名中則可以使用很多
3)當無法區別兩個標籤時, 將跳轉至位置最靠前的標籤
========================================================================

6、FOR
建立C:\TEST7.BAT,檔內容如下:
@ECHO OFF
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C

執行:
C:\>TEST7

執行以後,螢幕上會將C:盤根目錄下所有以BAT、TXT、SYS為副檔名的檔內容顯示出來(不包括隱藏檔)。