2016年10月31日 星期一

CAN Bus 環境經驗談

將硬體架好(目前使用的是帶有CAN Bus IC + CAN module),
硬體部分, CAN Module 從 IC 版上輸出 VDD, VSS, RX, TX, (Rx, Tx 不用像UART, Tx接Tx, Rx 接Rx, 另一邊的CANH, CANL也一樣, 但是CANH, CANL,要跨一個120歐姆的電阻

示波器, 顯示如下, 這是錯誤的波形,有可能是1.沒接對 2. bit rate 兩者不同,有可能A device是125Kmz, B device 是 250Khz





下面是對的波形, 250Khz, 這是對的波形







2016年3月9日 星期三

ESP8266 燒錄方法

上網找update ESP8266 tool 有找到,

但要說的不是軟體,重點是在硬體方面

ESP8266                    source
VCC        =>              3.3V
GND        =>             GND
RX            =>              TX
TX             =>              RX
CH_PD      =>           3.3V
RST          =>            x(不接)
GPIO0      =>             GND
GPIO2      =>            x(不接)

這樣再加上update tool就可以燒了







ESP8266用UART控制

先用UART轉USB的方法來測試一些功能是否正常


只寫我遇到的情況,其他上網找有一大堆說明

硬體方面遇到問題:
1.之前用UART轉USB的3.3V去做電源供應,發現電流不足,所以改用Power Supply供給3.3V
2.板子上的CH_PD腳要接到VCC(3.3V)





軟體遇到的問題:
板子上的軟體沒有更新,新版的是(AT+GMR 0018000902 OK),而我沒更新用115200 baudrate
1.我用的Terminal是RealTerm(Realterm_2.0.0.70),網路找也一大堆
選擇這個使用上會有亂碼的現象,下面是我選的選項,不會出現亂碼,選擇ansi






























2.AT Command,一行一行下command
1.剛裝好要先下AT ,是因為看有沒有回OK,如果有回OK,表示可以通
2.先掃一下wifi,                  AT+CWLAP
3.掃到後,                            AT+CWJAP="power","1122334455"
4.連上thingspeak.com,       AT+CIPSTART="TCP","183.106.153.149",80
5.告知要上傳的長度         AT+CIPSEND=52
6.要丟的資料                    GET /update?key=CKS7J99MM62TTJAC&field1=5&field2=9
這樣就可以在網上看到資料


下面是我遇到的問題
第四項問題:   183.106.153.149 就是thingspeak.com的IP address自固定的,80是port,也是固定
第五項問題:    連上後AT+CIPSEND=52  <<==52 因為長度不對,導致網站回應錯誤
第六項問題:   1.有很多網站會出現 (>) <==之前就是搞不懂,是自己要下command還是怎樣,結果                            是第五項下了之後就會產生(>)
                        2.CKS7J99MM62TTFJAC   <<==這種東西是thingspeak.com給的現在是我亂寫的                            不能照抄,在API keys(網頁),上網找,會有,要換上自己的

                         可以下2種方式上傳:
                          1.
                         AT+CIPSEND=52
                         GET /update?key=CKS7J99MM62TTJAC&field1=5&field2=9
                          2.
          AT+CIPSEND=78
          https://api.thingspeak.com/update?api_key=CKS7J99MM62TTJAC&field1=1&field2=5

                          請注意一下長度,如果還是看不到資料,可以在空白網頁上輸入
 https://api.thingspeak.com/update?api_key=CKS7J99MM62TTJAC&field1=1&field2=5

再到自己的thingspeak.com網頁裡看有沒有資料,有的話,表示thingspeak.com網站是可以填寫資料的


這是我下command索回傳的字串
















2016年1月20日 星期三

FreeRTOS xSemaphoreCreateMutex用法

親身體驗的結果,
測試環境:

Compiler: windows8.1 + CCS v6.1x
Software:撿到的FreeRTOS,應該是8.2.3版的
Hardware:EK-TM4C123GXL

測試功能是要使用2組UART(UART0,UART1),做printf,如果沒有用xSemaphoreCreateMutex,輕的會print不出來,重的會直接當機給你看,測試幾次,有2次是重新開機

xSemaphoreHandle g_pUARTSemaphore;
xSemaphoreHandle g_pUART1Semaphore;
int main(void)
{
     ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|        SYSCTL_OSC_MAIN); //80 MHZ
ConfigureUART();
UARTprintf("\n UARTprintf \nWelcome to the EK-TM4C123GXL FreeRTOS Demo!\n");

UART1_Init();
UART1printf("\nUART1printf \n Welcome to the EK-TM4C123GXL FreeRTOS Demo!\n");
        g_pUARTSemaphore = xSemaphoreCreateMutex();
        g_pUART1Semaphore = xSemaphoreCreateMutex();

       while(1);
}

下面是我的範例,如果拿掉xSemaphoreTake, xSemaphoreGive,只留下2行的UARTprintf,會很慘

extern xSemaphoreHandle g_pUARTSemaphore;
extern xSemaphoreHandle g_pUART1Semaphore;

static portTASK_FUNCTION(vTest2Task, pvParameters)
{
for( ;; )
{
                xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY);
UARTprintf("U0vTest2Task.......\r\n");
                xSemaphoreGive(g_pUARTSemaphore);

                xSemaphoreTake(g_pUART1Semaphore, portMAX_DELAY);
UART1printf("U1vTest2Task.......\r\n");
                xSemaphoreGive(g_pUART1Semaphore);

vTaskDelay( 1000/portTICK_RATE_MS );
}
}

//=======================================================
輕點當機,會進到系統裡的地方是,下面的地方
//*****************************************************************************
//
// This is the code that gets called when the processor receives a fault
// interrupt.  This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void
FaultISR(void)
{
    //
    // Enter an infinite loop.
    //
    while(1)
    {
    }
}







2015年5月12日 星期二

Filezilla Client windows8.1跟ubuntu 10.04安裝

server 是linux系統的,有用基本的putty的telnet連上過,沒問題

先講簡單的windows8.1

安裝完 Filezilla Client 3.10.3 , 打開後,開啟站台管理員,新增站台=>在一般設定=>
主機:192.168.xx.xx
連接埠:22
協定:SFTP-SSH File Transfer Protocol
登入型式:一般
使用者:xxx(在server的帳號)
密碼:xxx(在server的密碼)


再按連線,就可以看到successful


======================================================================
再說linux ubuntu10.04版的
先在terminal下
sudo apt-get install filezilla
安裝完後到
/usr/bin/
看看有沒有
filezilla
直接去執行filezilla,左鍵滑鼠敲2下,就可以打開filezilla
再往下做就跟windows的操作一樣







2015年5月11日 星期一

ubuntu 10.04 安裝圖形化介面

1.先在VM=>Install VMware Tools
首先發現會出現的問題, "VMware Tools installation cannot be started manually while Easy Install is in progress."

1.先確認一下,是否有選到的選項




如果還不行,就請用終極作法

1.將Floppy先移除掉,再重新add,一樣是選Auto detect,按ok
2.再將CD/DVD移除掉,再重新add,選Auto detect,在按ok






完畢後,再開機(power on),開機時會出現找不到Floppy,但不管它,開機後再選一次,VM=>Install VMware Tools,這樣就可以正常了,會出現cancel VMware Tools installation

=======================================================================
有安裝過ubuntu-14.10-desktop-amd64,跟安裝最新的ubuntu-15.04-desktop-i386,安裝老半天都沒法create share file,上面的就是我遇到其中的某一個問題,所以只好回到10.04,之前有使用過10.04版,但是燒到光碟版的安裝都沒什麼問題,我是
直接下載ubuntu 10.04,ubuntu-10.04.4-server-i386.iso,沒燒成CD,安裝完,啟動後,就變文字模式,如果要進入圖形化介面,在terminal,先安裝sudo apt-get install xinit,再打startx,哇~發現是變成白底黑字,在網上找到一些資料,做了一些動作都沒用,例如做一些update,
但是安裝完下面指令後就可以進入圖形化介面,但是安裝時間要很久,我下載時間約2小時多
sudo apt-get install ubuntu-desktop #gnome

如果再不行,可以試著換這個

sudo apt-get install Kubuntu-desktop #kde

我2個都有安裝,先安裝sudo apt-get install ubuntu-desktop #gnome,再安裝sudo apt-get install Kubuntu-desktop #kde,發現會讓你選擇是要執行gnome或kde,我選擇gnome,看起來是沒問題的






















2014年11月3日 星期一

MT7620 新增madplayer方法


要先下載madplayer的資料

madplay-0.15.2b.tar.gz
libmad-0.15.1b.tar.gz
libid3tag-0.15.1b.tar.gz

網址:
http://sourceforge.net/projects/mad/files/

zlib-1.2.8.tar.gz
網址:
http://sourceforge.net/projects/libpng/files/zlib/1.2.8/zlib-1.2.8.tar.gz/download

http://sourceforge.net/projects/libpng/files/zlib/

我是用mips的,所以我找了一些mip相關網站,參考,修改成我要的東西
1.
 先指定路徑:
TOOLCHAINPATH=/opt/buildroot-gcc342/bin/

2.安裝zlib
tar zxf zlib-1.2.8.tar.gz

cd zlib-1.2.8

./configure --prefix=$TOOLCHAINPATH

make CC=mipsel-linux-gcc 2>&1 | tee build.log

make install

3.安裝libid3tag

tar zxf libid3tag-0.15.1b.tar.gz

cd libid3tag-0.15.1b

RANLIB=mipsel-linux-ranlib AR=mipsel-linux-ar CC=mipsel-linux-gcc ./configure --prefix=$TOOLCHAINPATH --enable-static --disable-shared --host=mipsel-linux

make 2>&1 | tee build.log

make install

4.安裝libmad
tar zxf libmad-0.15.1b.tar.gz

cd libmad-0.15.1b

RANLIB=mipsel-linux-ranlib AR=mipsel-linux-ar CC=mipsel-linux-gcc ./configure --prefix=$TOOLCHAINPATH --enable-static --disable-shared --host=mipsel-linux

make 2>&1 | tee build.log

make install

5.安裝madplay

tar zxf madplay-0.15.2b.tar.gz

cd madplay-0.15.2b

LIBS="-lm -lz" RANLIB=mipsel-linux-ranlib AR=mipsel-linux-ar CC=mipsel-linux-gcc ./configure --prefix=$TOOLCHAINPATH --enable-static --disable-shared --host=mipsel-linux

make 2>&1 | tee build.log


基本上這樣是沒錯的,但是我安裝到最後會出現問題,不知道為什麼,請待續...

下面是我compiler過的

方法一:
安裝zlib
tar zxf zlib-1.2.8.tar.gz
cd zlib-1.2.8
CC=mipsel-linux-gcc AR="mipsel-linux-ar rc" RANLIB=mipsel-linux-ranlib ./configure --prefix=/opt/buildroot-gcc342/bin/mipsel-linux

export CPPFLAGS='-I../libmad -I../libid3tag'
export LDFLAGS='-L../libmad -L../libid3tag'

安裝libid3tag
./configure --host=mipsel-linux
make
cp .libs/libid3tag.a .

安裝libmad
./configure --host=mipsel-linux
make
cp .libs/libmad.a .

安裝madplay
./configure --host=mipsel-linux
make

我compiler後,會出現這樣的問題
../libtool: line 1644: cd: ../libmad: No such file or directory
libtool: link: cannot determine absolute directory name of `../libmad'
make[2]: *** [libintl.la] Error 1

解決方法:直接指到絕對路徑
修改Makefile
#vi Makefile
CPPFLAGS='-I/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libmad/ -I/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libid3tag/'
LDFLAGS='-L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libmad/ -L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libid3tag/'

最後再下:
#./configure --host=mipsel-linux --disable-debugging --disable-shared --enable-static CPPFLAGS='-I/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libmad/ -I/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libid3tag/' LDFLAGS='-L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libmad/  -L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libid3tag/.libs'
就過了
之後換make
#make
又會出現error
mipsel-linux-gcc: /root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libid3tag/.libs/.libs/libid3tag.so: No such file or directory
make[2]: *** [madplay] Error 1

再次修改Makefile
vi Makefile
找到下面那行
LDFLAGS='-L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libmad/ -L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libid3tag/.libs'
變成
LDFLAGS='-L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libmad/ -L/root/Workspace/SDK4120_Original_DRAM_128MB/source/user/madplay/libid3tag/
之後再make一次
#make
就過了

# file madplay

madplay: ELF 32-bit LSB executable, MIPS, MIPS-II version 1 (SYSV), dynamically linked (uses shared libs), not stripped

就會看到是用MIPS











2013年5月23日 星期四

PIC32MX795F512H相關的問題PK3Err0040 error massage

這顆CHIP發現有個問題,就是燒錄問題,在programmer可以燒錄,但是轉換成Debug時候就不能燒錄,會出現這樣的Massage:


PK3Err0040: The target device is not ready for debugging.
Please check your configuration bit settings and program
the device before proceeding.


檢查之後是因為Spec上有寫到的問題

bit 3 ICESEL: In-Circuit Emulator/Debugger Communication Channel Select bit
1 = PGEC2/PGED2 pair is used
0 = PGEC1/PGED1 pair is used
bit 2 Reserved: Write ‘1’
bit 1-0 DEBUG<1:0>: Background Debugger Enable bits (forced to ‘11’ if code-protect is enabled)
11 = Debugger is disabled
10 = Debugger is enabled
01 = Reserved (same as ‘11’ setting)
00 = Reserved (same as ‘11’ setting)

原來燒錄問題是出現在這顆IC有2個燒錄方式,分別是
1. PGEC1; PGED1
2. PGEC2; PGEC2
要看當時的版子是選用哪一種方式去燒路,所以要去選擇Configure->Configuration Bit->ICESEL
要看一下線路圖,Spec預設值是PGEC2/PGED2

線路圖的話,
要看一下PIC32MX795F512,100隻腳位PGEC1/PGED1是在pin24(PGEC1),pin25(PGED1)
                                                                  PGEC2/PGED2是在pin28(PGEC2),pin27(PGED2)

2013年5月5日 星期日

AVR makefile using a library

AVR version is 4.0

如果要在Atmel的AVR建立一個Library要做以下的步驟:

1.在makefile裡面新增一行:

##Link
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

avr-ar rcs libUART.a UART_App.o
%.hex: $(TARGET)
avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@ 

這是我擷取下來的,主要在Link後面加上 avr-ar rcs libUART.a UART_App.o   要注意一個地方,
 libUART.a 這個的lib很重要,一定要加lib不然compile不會過,avr-ar rcs libUART.a UART_App.o一定要空格

2.再到Edit Configuration Options->General->Use External Makefile 把自己寫好的makefile include進來

3.在跑一次Rebuild all,就會跑出 libUART.a

4.把自己Build的libUART.C檔移除,只剩下libUART.a

5.再到Edit Configuration Options->libraries->library search path 只到自己建立的 libUART.a路徑

6.Edit Configuration Options->libraries->Available Link Objector-> libUART.a  add Objector 到Link with These Objects->確定

7.再做一次Rebuild All


2012年9月4日 星期二

常用的C語言指標用法


typedef struct
{
   unsugned char bit0:1;
   unsugned char bit1:1;

   unsugned char bit2:1;
   unsugned char bit3:1;

   unsugned char bit4:1;
   unsugned char bit5:1;

   unsugned char bit6:1;
   unsugned char bit7:1;


}type_data;

        unsigned char *data_prt;
type_data temp_data;

data_prt = (unsigned char*) & type_data ;
*data_prt = cmd;//cmd is data, put cmd to type_data 8bit

or
      cmd = *dtat_prt; //type_data put to cmd

2012年2月21日 星期二

Atmel Chip要注意的地方跟常忘記的事情

Compiler Software is AVR Studio 4
********************************************************************************************
一般Timer的算法:
頻率:4M
打出軟體PWM:3K
1.4000000/3000=1333.33333333 ; 所以4M/1333.3333333=3000.00000007輸出約3K
  所以4M/1334=2998.50074962   
2.8bit-(0.00033333333*4M/8/1)
  8bit=256
  256-(0.00033333333*4000000/8(軟體除頻)/1(cpu除頻))=90 ==>輸出約3K

Atmega48/88/168 CTC Mode 要注意的地方
1.目前所實驗的是使用 WGM13:0 = 4 ((WGM13,WGM12,WGM11,WGM10)=0100)
2.OCR1A 可以用來設定PWM的輸出
3.TCNT1跟OCR1A做比較後,計數器會歸零,EX:TCNT1=0x0000, OCR1A=0x0FF0, TCNT1會計數到0x0FF0會產生中斷,並將TCNT1清除歸零
4.OCR1A定義是計數器的TOP值
*5.OCR1A計數到TOP時,會產生中斷,
*6.OCR1A小於TCNT1,計數器會丟失這次比較,並會數到0xFFFF,然後再重0x0000重新計數到OCR1A所設定的值
*7.OCF1A是計數到TOP值後,所產生的中斷旗標,
1.如果使用Timer 去計算 時間的中斷的話,OCR0A絕對不能去設定


********************************************************************************************
//AVR Studio 4
*****  函式裡的參數第一個字不能是大寫
Bug mesesge ==>.././_include/UART_Mega48.h:82:26: error: expected ';', ',' or ')' before numeric constant

********************************************************************************************
ATmega48
裡面UART的RX要接TX,TX接RX
自己做的UART轉USB,GND的旁邊是TX,再過來是RX

********************************************************************************************
Tiny461 使用AD有關問題,需要注意的地方
Auto trigger mode 有個bit要注意 ADCSRA |= (1<<ADATE);這bit要注意,
   ADATE Enable:當使用外部的crystal,不知為什麼不能使用會抓不到值,但使用內部的8Mhz,就可以抓的到
   ADATE Disable:可以使用外部的Crystall就沒問題
***特別要注意的地方,在JTAGICE裡面的fuses==>BODLEVEL要選Brown-out detection disable 因為如果要做ADC的功能的話必須要Disable,不然會影響ADC,
  EX:選4.3v會偵測到3.76v
    選Brown-out detection disable就可以detect到0~5v
  
EX 1:  這的設定結果只能抓到0v~3.76v之間的電壓,以上的話是會顯示最大值,192==>192/255(8bit)*5v= 3.7647  <<此現象必須把BODLEVEL disable
 ADCSRA_Prescaler_Select(Division_2);  //ADCSRA = (1<<ADPS0);
 ADCSRB_Auto_Trigger_Enable(Counter0_Overflow); //ADCSRB |= ((1<<ADTS2));  // ADCSRA |= (1<<ADATE); //use Auto trigger enable, but can't use external crystall
 ADMUX_Voltage_Mode(VCC_Voltage);  //VCC used as voltage reference,disconnected from AREF ADMUX &= ~((1<<REFS1)|(1<<REFS0));
 ADMUX_InputChannle_Mode(AnalogCannel_1); //ADC0   ADMUX &= ~((1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));  //  ADC0 (PA0)
 DIDR0 |= ((1<<AREFD) | (1<<ADC0D));
 ADCSRA_Enable();
 ADCSRA_Start();

2012年2月13日 星期一

C++ MFC

剛玩VC++,MFC有點不清楚,所以就用筆記,記錄下來,
1.新增專案==>win32專案
2.應用程式設定==>選windows應用程式,跟空專案
3.在方案總管下的自己命名的名稱中,按下右鍵,在最下面有個"屬性"
   ==>MFC的使用==>使用MFC的靜態程式庫
   ==>字元集==>使用多位元組字元集
4.在方案下的自己命名的名稱下,裡面有"原始程式檔",按下滑鼠右鍵==>加入==>新增項目==>C++檔
*******************************************************************
***m_pMainWnd 屬性(事實上,此屬性是由CWinApp類別繼承自CThreadWnd類別),此屬性將指定應用是物件使用的視窗框架物件
***InitInstance(),程式進入點,必須設定該屬性
***MyApp a_app; 建立應用程式物件
以上是最基本的條件

#include <afxwin.h> //載入afxwin標頭檔
class MyApp : public CWinApp //繼承CWinApp
{
public:
 BOOL InitInstance() //程式進入點
 {
  CFrameWnd *Frame = new CFrameWnd(); //建立CFrameWnd物件
  m_pMainWnd = Frame; //將m_pMainWnd設定為Frame
  Frame->Create(NULL,"Hello MFC"); //建立視窗
  Frame->ShowWindow(SW_SHOW);
  return true;
 }
};
MyApp a_app; //建立一個應用程式物件,MyApp為自訂的應用程式類別

                    

2012年1月16日 星期一

單晶片一些相關的用法

指標:
[ 定義 ]
一個變數,用來存放變數位址。

[ 宣告方式 ]
1.
int i = 100;
int *ptr = &i; //宣告ptr為指標,存入i的位址

2.
int i = 100;
int * ptr; //宣告ptr為指標
ptr = &i; //存入i的位址。不可以寫成*ptr = &i
函式型態的別名:
很多寫 C/C++ 的人都把 typedef 當成#define 來使用。
誠然,像這樣的定義
typedef unsigned short WORD;
就相當於
#define WORD unsigned short
但就本義來說,#define 是字串的取代,例如
#define WORD Hello!
在程式任何使用到 WORD 的地方會用 Hello! 取代 WORD

typedef看來不怎麼有用是吧!?非也,由於所謂 C/C++ 的型態是很廣義的,使用typedef
可以使程式看起來簡潔易懂且不容易出錯。下面是幾個typedef的應用例子:

簡單型態的別名
typedef unsigned char BYTE;//定義無號單字節的型態
typedef unsigned short WORD;//定義無號雙字節的型態
typedef unsigned long DWORD;//定義無號四字節的型態
//嗯!這三行沒什麼大不了,用#define也可以做

結構型態的別名
typedef struct StructTag{
int mA;
int mB;
}STRUCTTAG, *PSTRUCTTAG;
當要建立這個結構的物件時,就可以用別名 STRUCTTAG 和 PSTRUCTTAG,例如
STRUCTTAG StructObj;
PSTRUCTTAG pStructObj;
就相當於
struct StructTag StructObj;
struct StructTag *pStructObj;

函式型態的別名
如果你有一個 library 提供了字串轉整數的函式
int HexToInt(char *str);//十六進位字串轉整數
int DecToInt(char *str);//十進位字串轉整數
當你的程式要使用這些函式時,就必需include這些函式的定義,但用typedef會
更簡潔:
typedef int ToInt(char *str);
//上面這行定義了一個需傳入字串(char *)且返回整數(int)的函式型態別名
//叫 ToInt
ToInt HexToInt,DecToInt;//宣告HexToInt,DecToInt這兩個函式
現在你的程式可以呼叫HexToInt(...),DecToInt(...)了。

在Windows,通常是應用程式呼叫API來工作的,但由於某種需求,Windows API
會反過來呼叫應用程式的函式,這種函式稱之為 callback function
callback function 對API來說只有該傳入那些參數和返回值型態,沒有函式名稱而用函式
指標來呼叫(事實上Windows也不可能用程式的函式名稱來呼叫)。這時使用函式型態的別名
來宣告函式指標就特別好用了。
舉個例子吧!建立一個新的行程(Thread)的函式:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc,
LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT
nStackSize = 0, DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

其中AFX_THREADPROC就是一個函式型態的別名
它的定義是
typedef UINT (AFX_CDECL *AFX_THREADPROC)(LPVOID);
//AFX_THREADPROC 是一個傳入一個指標參數返回UINT型態值的函式
//指標的名稱(AFX_CDEL是標明函式呼叫為 __cdecl(C style calling convention))

用這個宣告,不論API或應用程式本身都很方便,如應用程式可以這樣來
開啟行程:
CWinThread* pMyThread=AfxBeginThread(
(AFX_THREADPROC)MyThreadFunc,............
是不是很簡潔明瞭?嗯...MyThreadFunc算不算 callback function 有點疑義,但做為 typedef 的使用例子應沒問題的

typedef :

將資料型態定義成自己希望的識別字,方便撰寫程式.

比方說

typedef int number; // 表示number識別字和int相同.
int n; // 宣告一個int變數n.
number n; // 宣告一個number變數n,而number其實就是int.

又比方說有一個結構叫做record

struct record
{
int number;
struct record *next;
}

typedef struct record Node; // 表示Node識別字和struct record相同.

struct record record1; // 宣告一個record結構名為record1.

Node record1; // 宣告一個Node 結構名為record1,而Node 其實就是 struct record的意思.

除了省下了打字的力氣以外,由於不同的機器使用的資料型態都不太一樣,換機器跑程式時,只要修改typedef就好了,增加了C的可攜性.

[ 參考 ] http://home.educities.edu.tw/peterhuang1/Clan/CLanTypedef.htm

2.
struct t_Point
{
int x; int y;
}; // 注意,這裡最後一個分號不能省略

int main(int argc, char* argv[])
{
struct t_Point a, b;
// . . .
return 0;
}

顯然,這種方法沒有typedef更加直觀(在C++中,main函數第一行的struct關鍵字可以省略,但在標準C中,省略該關鍵字會出現編譯錯誤)。

此外,對於定義鏈接隊列中的結點,我們可以這樣實現:

typedef struct t_node
{
int Value;
struct t_node *next;
} Node;

當然也可以這樣定義:

typedef strcut t_node Node;
struct t_node
{
int Value;
Node *next;
};

結構中的冒號; 位域 :

位域
  有些信息在存儲時,並不需要佔用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個字節中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:

  struct 位域結構名

  { 位域列表 };

  其中位域列表的形式為: 類型說明符 位域名:位域長度

  例如:

struct bs
{
 int a:8;
 int b:2;
 int c:6;
};


  位域變量的說明與結構變量說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:

struct bs
{
 int a:8;
 int b:2;
 int c:6;
}data;


  說明data為bs變量,共佔兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對於位域的定義尚有以下幾點說明:

  1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:

struct bs
{
 unsigned a:4
 unsigned :0
/*空域*/ unsigned b:4 /*從下一單元開始存放*/
 unsigned c:4
}


  在這個位域定義中,a佔第一字節的4位,後4位填0表示不使用,b從第二字節開始,佔用4位,c佔用4位。

  2. 由於位域不允許跨兩個字節,因此位域的長度不能大於一個字節的長度,也就是說不能超過8位二進位。
  3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
 int a:1
 int :2 /*該2位不能使用*/ int b:3
 int c:2
};


  從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。

  二、位域的使用

  位域的使用和結構成員的使用相同,其一般形式為: 位域變量名·位域名 位域允許用各種格式輸出。

main(){
 struct bs
 {
  unsigned a:1;
  unsigned b:3;
  unsigned c:4;
 } bit,*PBit;
 bit.a=1;
 bit.b=7;
 bit.c=15;
 printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
 PBit=&bit;
 PBit->a=0;
 PBit->b&=3;
 PBit->c=1;
 printf("%d,%d,%d\n",PBit->a,PBit->b,PBit->c);
}

  上例程序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變量bit和指向bs類型的指針變量PBit。這表示位域也是可以使用指標的。

  程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許範圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變量bit的地址送給指針變量PBit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: PBit->b=PBit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"=", 相當於: PBit->c=PBit->c1其結果為15。程序第17行用指針方式輸出了這三個域的值。

Camera相關知識

AE锁
    AE是automatic exposure自动曝光控制装置的缩写,AE锁就是锁定于某一AE设置,用于自动曝光时人为控制曝光量,保证主体曝光正常。
    使用AE锁有几点需要注意:1、手动方式或自拍时不能使用自动曝光(AE)锁。 2、按下自动曝光(AE)锁之后不要再调节光圈大小。 3、用闪光灯摄影时不要使用(AE)锁。
    CCD
    中文译为:电子耦合组件(charged coupled device),它就像传统相机的底片一样,是感应光线的电路装置,你可以将它想象成一颗颗微小的感应粒子,铺满在光学镜头后方,当光线与图像从镜头透过、投射到CCD表面时,CCD就会产生电流,将感应到的内容转换成数码资料储存起来。CCD像素数目越多、单一像素尺寸越大,收集到的图像就会越清晰。因此,尽管CCD数目并不是决定图像品质的唯一重点,我们仍然可以把它当成相机等级的重要判准之一。
CMOS
    comple-mentary metal-oxicle-semiconductor,中文译为:互补金属氧化物半导体
    DPOF
    DPOF指的是数码打印顺序指令,用于在存储介质(影像记忆卡等)上记录信息。在此格式下,你可以设定将数码相机拍摄的那些影像进行打印以及进行打印多少张。
    EXIF
    所谓EXIF (exchangerable image file format for digital still cameras) ,就是由jeita(电子信息技术产业协会)制定的、决定记录jpeg 图像和声音的文件上的附加信息的方式的规格。     
   EXIF 2.2
    EXIF 2.2 版是一种新改版的数码相机文件格式,其中包含实现最佳打印所必需的各种拍摄信息。
    PTP
    PTP是英语“图片传输协议(picture transfer protocol)”的缩写。
    PTP是最早由柯达公司与微软协商制定的一种标准,符合这种标准的图像设备在接入Windows XP系统之后可以更好地被系统和应用程序所共享,尤其在网络传输方面,系统可以直接访问这些设备用于建立网络相册时图片的上传、网上聊天时图片的传送等。
    当然,这主要是为方便计算机知识不多的普通用户的,使相机、应用软件、网站....结合在一起更容易地完成一些傻瓜式功能。
CMOS
    comple-mentary metal-oxicle-semiconductor,中文译为:互补金属氧化物半导体
    DPOF
    DPOF指的是数码打印顺序指令,用于在存储介质(影像记忆卡等)上记录信息。在此格式下,你可以设定将数码相机拍摄的那些影像进行打印以及进行打印多少张。
    EXIF
    所谓EXIF (exchangerable image file format for digital still cameras) ,就是由jeita(电子信息技术产业协会)制定的、决定记录jpeg 图像和声音的文件上的附加信息的方式的规格。     
   EXIF 2.2
    EXIF 2.2 版是一种新改版的数码相机文件格式,其中包含实现最佳打印所必需的各种拍摄信息。
    PTP
    PTP是英语“图片传输协议(picture transfer protocol)”的缩写。
    PTP是最早由柯达公司与微软协商制定的一种标准,符合这种标准的图像设备在接入Windows XP系统之后可以更好地被系统和应用程序所共享,尤其在网络传输方面,系统可以直接访问这些设备用于建立网络相册时图片的上传、网上聊天时图片的传送等。
    当然,这主要是为方便计算机知识不多的普通用户的,使相机、应用软件、网站....结合在一起更容易地完成一些傻瓜式功能。
图片传输协议
    图片传输协议英文全称为:picture transfer protocol,缩写为PTP。 PTP是由柯达与微软协商制定的一种标准,符合这种标准的图像设备在接入windows XP系统之后可以更好地被系统和应用程序所共享,尤其在网络传输方面,系统可以直接访问这些设备用于建立网络相册时图片的上传、网上聊天时图片的传送等。当然,这主要是为方便计算机知识不多的普通用户的,使相机、应用软件、网站等结合在一起更容易地完成一些傻瓜式功能。    
    图像储存格式
    由于数码相机拍下的图像文件很大,储存容量却有限,因此图像通常都会经过压缩再储存。最常见的图像储存格式就是jpeg和TIFF档,jpeg经过高度压缩,能使档案变为原先的1/4、1/8或1/16大小左右,因此可以省下不少储存空间,不过相对也会让原始图像资料有所损失,许多相机都会提供特定的压缩比例供使用者自己选择。
TIFF文件几乎未经压缩,所以图像会比Jpeg保持地更完整。不过因为图像分辨率越高、压缩越小就越占记忆空间,所以拍照时必须兼顾对图像的品质要求与记忆卡容量。举例来说,一张8MB的内存卡存640×480分辨率、高压缩格式的照片可能可以存80张,可是如果存1024×768、未压缩格式的照片就只能存3张,差异其实非常大,因此拍摄前必须先预设储存模式或干脆准备好足够的内存卡。
    无损和有损压缩
    无损压缩和有损压缩是数码图像文件压缩的两种类型。 无损压缩是对文件本身的压缩,和其它数据文件的压缩一样,是对文件的数据存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容,对于数码图像而言,也就不会使图像细节有任何损失。而有损压缩是对图像本身的改变,在保存图像时保留了较多的亮度信息,而将色相和色纯度的信息和周围的像素进行合并,合并的比例不同,压缩的比例也不同,由于信息量减少了,所以压缩比可以很高,图像质量也会相应的下降。
GT镜头
    GT镜头是指美能达独特设计的多片多组配合巧妙的镜头组件,镜头镜片使用高档低色散光学玻璃,其中包含多枚模铸成型非球面镜片等等。也就是说美能达的 G 系列高档专业传统相机(银盐相机)使用的镜头称为AF镜头,而美能达将生产 G 系列镜头的工艺技术应用于数码相机的设计生产中,所生产出的产品就称为 GT 镜头。     
    蔡司镜头
    即zeiss。蔡司是一家致力於应用研究,对於光学、玻璃技术、精密技术以及电子等高品质的产品开发、制造、销售有贡献的德国企业,从 1846 年开始,carl zeiss 已开设生产显微镜的工作坊。zeiss镜头,专业的摄像,摄影镜头     
  广角镜
    即wide angle,又叫短焦镜头。广角镜因焦距非常短,所以投射到底片上的景物就变小了扩阔镜头拍摄角度,除可拍摄更多景物,更能在狭窄的环境下拍摄出宽阔角度的影像。
    IESP自动聚焦
    IESP英语intelligent electro selective pattern(智能电子选择模式)的缩写。IESP自动聚焦是数码相机在对焦范围内做多重区块分割(有资料称分割方式为扇形分割),再将分割区块所测得焦点位置综合运算,根据主体的不同状态,确定最佳焦距位。IESP自动聚焦在奥林巴斯数码相机的介绍中经常看。
变焦
    镜头的另一个重点在变焦能力,所谓的变焦能力包括光学变焦(optical zoom)与数码变焦(digital zoom)两种。两者虽然都有有助于望远拍摄时放大远方物体,但是只有光学变焦可以支持图像主体成像后,增加更多的像素,让主体不但变大,同时也相对更清晰。通常变焦倍数大者越适合用于望远拍摄。光学变焦同传统相机设计一样,取决于镜头的焦距,所以分辨率及画质不会改变。数码变焦只能将原先的图像尺寸裁小,让图像在lcd屏幕上变得比较大,但并不会有助于使细节更清晰。因此购买数码相机时,我们往往建议大家留意光学变焦的倍数。目前中端相机普遍都有3倍左右的光学变焦,不过也有具超长变焦功能的产品,例如10倍光学变焦的机种。
    光学变焦
    是依靠光学镜头结构来实现变焦,变焦方式与35mm相机差不多,就是通过摄像头的镜片移动来放大与缩小需要拍摄的景物,光学变焦倍数越大,能拍摄的景物就越远。如今的数码相机的光学变焦倍数大多在2倍-5倍之间,也有一些码相机拥有10倍的光学变焦效果。家用摄录机的光学变焦倍数在10倍~22倍,能比较清楚的拍到70米外的东西。使用增倍镜能够增大摄录机的光学变焦倍数。
    数字变焦
    即digital zoom,实际上是画面的电子放大,把原来CCD影像感应器上的一部份像素使用“插值”处理手段做放大,将CCD影像感应器上的像素用插值算法将画面放大到整个画面。通过数码变焦,拍摄的景物放大了,但它的清晰度会有一定程度的下降,有点像VCD或DVD中的zoom功能,所以数码变焦并没有太大的实际意义。目前数码相机的数码变焦一般在6倍左右,摄像机的数码变焦在44倍-600倍左右,实际使用中有40倍就足够了。如果变焦倍数不够,我们可以在镜头前加一增倍镜。如果拍摄的视角小,可以相应的加一广角镜。     
    智能变焦
    全新独有的sony智能变焦功能.可放大变焦拍摄,不会将微粒放大,令放大的影像也能保持原有的细致质素.智能变焦因应不同影像尺寸的选择,提供不同程度的强化变焦功能.有别于数码变焦,智能变焦能保持画质与原本影像相同。
    程序式自动曝光
    程序式自动曝光是电子技术与人工智能相结合的产物,采用这种方式曝光时,相机不但能根据光线条件算出合适的曝光量,还能自动选择合适的曝光组合。
    超焦距
    由于镜头的后景深比较大,人们称对焦点以后的能清晰成像的距离为超焦距。傻瓜相机一般就利用了超焦距,利用短焦镜头在一定距离之后的景物都能比较清晰成像的特点,省去对焦功能,所以,一般低档的傻瓜相机并不能自动对焦,只是利用了超焦距而已。正如前面所说的,“清晰”不是一个绝对的概念,超焦距范围内的景物并非真正的清晰成像,由于不在对焦点上,肯定是模糊的,只是模糊的程度一般人能够接受而已,这就是傻瓜相机拍摄的底片不能放大得太大的原因。

單晶片C語言,Volatile使用

轉貼  http://ethanjob.blogspot.com/2007/02/volatile.html

volatile宣告 在C裡面有volatile這個宣告,通常是說這個變數會被外在routine改變, 在kernel裡面通常是指會被interrupt handler(有時就是硬體中斷的routine) 改變值,也就是被非同步的改變的變數。例如 unsigned long vloatile jiffies; jiffies在kernel是時間每次hardware的中斷會來改這個值 在asm裡面是說這個東西compiler時,gcc不要雞婆作optimized,因為 最佳化的結果,compiler會把code按照他想的方法放到記憶體裡, 但是有的code我們需要特定指定他一定要在某個記憶體上, 在kernel裡常有這樣情形發生,我們可以用 __asm__ __volatile__宣告一段assembly的code是不要做最佳化的。 例如cli sti #define disable() __asm__ __volatile__ ("cli"); #define enable() __asm__ __volatile__ ("sti");

[ 例1 ]

Volatile這玩意兒用在單晶片的C語言較多

例如:
Volatile char wait;
void xxx(void)
{
wait=1;
while (wait!=0);
.....
.....
}
void timer0(void) interrupt 1
{
wait=0;
.......
}

xxx()中就是等一個timer中斷才執底下工作.
如果不寫Volatile會被編譯器省略掉.
因為wait=1;何來wait會等於0

[ 例2 ]

volatile sig_atomic_t read_flag = 1;

volatile是一個關鍵字(keyword),用來修飾詞資料型態,與const有對應的關係。
是語言關鍵字的話,就不會出現在標頭檔內的定義。
volatile sig_atomic_t read_flag = 1;
read_flag是一個為sig_atomic_t的資料型態,透過volatile的修飾,說明sig_atomic_t在程式中,可以在任何的時間下被修改 ,
也就是說,你的程式可能同一時間不止一個程序在使用。
可能主程式main在使用的同時,I/O Device或另一個thread也在利用或指定這個read_flag
來透過溝通的作用。

[ 例3 ]

http://www.programmersheaven.com/articles/pathak/article1.htm

[ 參考 ]

http://www.programmersheaven.com/articles/pathak/article1.htm

http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060329085552QSX&fumcde=FUM20050124191259IGD&rplcnt=5

2011年9月2日 星期五

SD card有發現容量變小, 找不到,無法格式化

1.在ubuntu 11.04下的桌面,按右鍵,選擇format,會找到Disk Utility
2.進去後,找到Format Drive==>Format ****** 如果不能Format,請找一下mount Volume把它給unmount,就可以format
3.如果在中間的Volumes 下面的bar沒有看到new volume ,就要再去執行Format Volume
4.再去執行mount volume
5,如果以上是在桌面上看不到磁碟機的話,請到請到請到system==>administration==>Disk Utility,在左邊可以看到SD card, 一樣可以


使用SD card的partition啟動NAND

有測試過的,搞了好久,
1.在ubuntu 11.04 linux下,要先知道SD card掛在哪,請在桌面下按右鍵,選擇format,最上面那行就會跟你說是哪一個,測試看到的是 /dev/sdb1
2.打開終端機,sudo fdisk /dev/sdb    <===sdb 要注意這點,不是sdb1
3.不知道指令請按 "m",  "d"是刪除partition 
                       Command (m for help): d
                        Selected partition 1

   "n",是新增一個partition
   Command (m for help): n
   Command action
   e   extended
   p   primary partition (1-4)
 

   "p"建立主要的partition
   p
    Partition number (1-4): 1   <===要幾個partition

   First cylinder (1-1017, default 1): 50    <=====輸入要劃多大的容量
Last cylinder, +cylinders or +size{K,M,G} (50-1017, default 1017):
Using default value 1017


 4.在將SD card 設定成FAT格式,
    sudo mkfs -t vfat /dev/sdb1    <====注意,這次是有sdb1
5. 在windows xp下測試一下SD card是否能打開,有問題的話,會秀需要格式化
=============================================
6.再到windows xp,打開winhex 程式,把剛剛設定好的SD card 透過USB轉卡放去windows下, 再到winhex下的==>tools==>Open Disk==>在physical media選擇剛剛的SD card===>OK
7.再按2下,Unpartitioned  <===這是剛剛在linux 下設定的空間,就是上面的50
8.在0x00~0x1C0,這段空間就是要把u-boot放進去的地方
9.將0x1C0這一行給記錄下來,這一行是在跟PC說它的容量大小,所以必須要記下來
10.去tools==>Disk Tools==>Clone Disk==>Source,選擇右邊像文件的icon,把要寫到partition的u-boot打開,如果看不到,請打*,   Destination,選擇右邊像磁碟機的icon,指到Physical Media下面的SUB( 就是指SD card),右邊的Copy entire raw image file選項要打勾,start sector要輸入0(零),剩下的不管,就是不打勾==>ok
11.會出現很多的訊息,這些全部都按"確定"
12.在將剛剛所備份的0x1C0那行,回存到當前的0x1C0
13.File==>save    大功靠成
14.將要燒得檔案放入SD card中
15.以上就可以測試燒錄了









2011年8月1日 星期一

ubuntu使用root權限

1.在桌面下按左鍵,執行Creat Launcher
2.(1)Type         ==>Application in terminal
   (2)Name       ==>root權限     <==檔案名稱
   (3)Command==>sudo nautilus
3.桌面就會出現icon
4.去執行"root權限"
5.輸入 user password
6.這樣就可以看到root的目錄

2011年7月28日 星期四

將bin檔案放置SD card

1.要先用linux ubuntu format SD card
   sudo fdisk /dev/sdc     =>sdc 這是要看插入sd card是在哪裝置
    輸入後,顯示如下:
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help):
Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): d
Partition number (1-4): 1

Command (m for help): n
Command action寫最後面的數字
   p   primary partition (1-4)
p
Selected partition 1
First cylinder (1-1015, default 1): 50     <== 50 是要寫入檔案的大小
Last cylinder, +cylinders or +size{K,M,G} (50-1015, default 1015): 1015   <= 50-1015 寫最後面的數字

Command (m for help): w
The partition table has been altered!


上面是我操作的指令

sudo mkfs -t vfat /dev/sdd       <==更改為fat format
最後到windows xp上格式化就好了
完成 !!!!!

破解Android系统root權限

3.7 破解Android系统root权限

《Google Android程序设计指南》第3章Android SDK开发平台应用,本章的主要内容有Android仿真器;Android仿真器启用SD存储卡的方法;如何开启Android仿真器的多媒体功能;安装/移除APK应用程序;Android已开发程序示范与应用;Android SDK开发工具使用方法;Android已开发程序示范与应用;破解Android系统root权限。本节为大家介绍破解Android系统root权限。

AD:

3.7  破解Android系统root权限

不知读者是否已经发现使用DDMS资源管理器功能或者adb shell浏览Android系统文件时,除了/sdcard目录可读取外,其他目录几乎都没有访问权限,因为Google认为手机使用者并非都是专业的Linux玩家,所以将Android系统的root权限给移除了。此举可避免有不了解情况的一般使用者,使用root权限并运行 rm -Rf / 之类的指令,将手机系统给全部删除了,如果发生这种情况的话,Android手机系统马上就全毁了,而使用者自己本身的个人信息也全毁了。因此出厂设置时,将root权限从Android手机上移除,这样的防护固然有道理,但是对真正的玩家而言,没有root权限真的是绑手绑脚,无法完全探究Android G1手机的功能,接下来我们就介绍如何快速取得G1手机root权限的方法。

Step 1  安装远程终端机

首先请开启手机WiFi功能,并使用手机浏览器连接下列网址以取得pTerminal远程终端机的APK应用程序组件src.com.poidio.terminal.apk。

    http://android-dls.com/files/src.com.poidio.terminal.apk

也可以利用Android Market程序从该网站下载pTerminal远程终端机。如果先前已经在G1手机设置了接收Unknown Source文件(点选MENU按钮→Settings→Applications→勾选Unknown sources),那么下载该APK文件时,就会自动提示安装pTerminal,不需要再通过adb install指令来安装该APK组件。

Step 2  启动pTerminal远程终端机

请在Android G1手机的应用程序列表运行 cd /system/bin与telnetd这两个指令启动telnetd服务器,如图3-34所示。

(点击查看大图)图3-34  启动telnetd服务器

Step 3  取得G1手机WiFi无线网络IP Address

然后继续在pTerminal指令列运行netstat指令,取得WiFi无线网络的IP Address,也可以在手机主画面单击MENU按键→Settings→Wireless controls→Wi-Fi取得IP Address,在此假设取得的G1手机WiFi网络IP Address为209.85.175.100。

    netstat

Step 4  在个人计算机连接G1手机

在G1手机启动telnetd并取得WiFi IP Address为209.85.175.100后,请在个人计算机操作系统的终端机运行telnet指令。登录后,就可以看到"#"符号,表示已经取得G1手机的root权限了。

    telnet 209.85.175.100

Step 5  重新挂接Android系统目录

取得root权限后,请运行下列mount指令,重新挂载Android系统目录,这样所有的系统目录都变成可以访问了。

    # mount -o rw,remount /dev/block/mtdblock3 /system

Step 6  破解RC30新版G1手机权限

不过您要知道,Google也不是省油的灯,发现G1手机被轻易地破解root权限后,当然是让面子挂不住了。Google马上再推出新版的G1手机并更改这个软件漏洞。可以在G1手机主画面点选"MENU→Settings→About Phone"查看Build number字段的手机版本是否为RC30,如图3-35所示。若是的话,以上方法无法破解取得G1手机root权限,仅有RC7、RC19、RC28与RC29的旧版本才能使用以上方法破解root权限。而对于RC30以后版本的破解方法则是必须先将新版G1手机系统降级为RC29之后的版本,然后再使用上述的方法破解。可以从下列网站取得将RC30系统降级为RC29版本的映像文件约45 MB,不过系统降级风险请自行负责。

    http://koushikdutta.blurryfox.com/G1/DREAIMG-RC29.zip