/* (C) 2003-2007 Willem Jan Hengeveld * Web: http://www.xs4all.nl/~itsme/ * http://wiki.xda-developers.com/ * * $Id: pcmon.cpp 1502 2007-04-15 07:54:20Z itsme $ */ #include #include "stdio.h" #include "debug.h" #include "stringutils.h" /* * ; all command packets have this format: ; 0xaa, lengthbyte, commandbyte, data....... ; all command replies have this format: ; 0xaa, lengthbyte, commandbyte, statusbyte, data....... ; where all 0xaa bytes in the data are duplicated. ; cmd00 - check_version ; request 0x00 ->r0=0 0x01, cmd ; "5, 0x00, 0, b1, b2, b3" -> "0, 0, ?, ?, b1, b2, b3" ; b1 : info ; v1 : minor version nr ; v2 : major version nr ; cmd01 - detect flash type ; request 0x01 ->r0=0 0x01, cmd ; "3, 0x01, 0, b1" -> "cmd, 0, ?, ?, b1" ; request 0x02 ->r0=0 0x01, cmd ; "3, 0x02, 0, b1" -> "cmd, 0, ?, ?, b1" ; request 0x03 ->r0=0 0x01, cmd ; "3, 0x03, 0, b1" -> "cmd, 0, ?, ?, b1" ; request 0x04 ->r0=0 0x01, cmd ; reply 0x04, status ; cmd05 - upload to flash ; request 0x05 ->r0=0 0x01, cmd ; w1 = checksum, l1 = crc ; "10, 0x05, 0, w1, w2, l1" -> "cmd, 0, ?, ?, w1, w2, l1" ; cmd06 - end srecord upload ; request 0x06 ->r0=0 0x01, cmd ; "3, 0x06, 0, b1" -> "cmd, 0, ?, ?, b1" ; request 0x07, ?, n1, n2, n3 ->r0=0 0x04, 0x07, n1, n2, n3 ; "n, 0x07, 0, blen, w1, w2, ..." -> "cmd, 0, ?, ?, blen, ?, w1, w2, ..." ; request 0x08, ?, n1, n2, n, ?, w1, w2, ... ; n>0x40 -> r0=4 ; n<0 -> r0=0 0x04, 0x08, n1, n2, n ; else -> r0=0 0x04, 0x08, n1, n2, n, w1, w2, ... ; reply -> 0x08, status ; cmd09 - upload to ram ; request 0x09 ->r0=0 0x01, 0x09 ; "6, 0x09, 0, w1, w2" -> "9, 0, ?, ?, w1, w2" ; cmd0a - execute ; request 0x0a, ?, n1, n2, n3, n4 ->r0=0 0x05, 0x0a, n1, n2, n3, n4 ; reply -> 0x0a, status ; request 0x0b ->r0=0 0x01, 0x0b ; "10, 0x0b, 0, w1, w2, l1" -> "cmd, 0, ?, ?, w1, w2, l1" ; * * */ HANDLE OpenComport(char *portname); bool SetCommParams(HANDLE hPort, int speed, int bits, int parity, int stopbits); bool WriteData(HANDLE hPort, int nChars, ...); int ReadData(HANDLE hPort, BYTE *buffer, int bufsize); bool SendCommand(HANDLE hPort, int nChars, ...); int main(int , char **) { DebugStdOut(); HANDLE hPort= OpenComport("COM1:"); if (hPort==INVALID_HANDLE_VALUE) { error("OpenComport COM1:"); return 1; } if (!SetCommParams(hPort, 115200, 8, NOPARITY, ONESTOPBIT)) { CloseHandle(hPort); error("SetCommParams"); return 1; } PurgeComm(hPort, 0xf); /* printf("sending aa 01 00\n"); SendCommand(hPort, 3, 0xaa, 0x01, 0x00); printf("sending aa 01 01\n"); SendCommand(hPort, 3, 0xaa, 0x01, 0x01); */ // 11 02 responds with // 02 11 00 00 00 20 03 "Trace module started by the environment" 02 // 02 11 00 00 00 00 01 "RVT: Lost Message" 02 // 02 17 "4D01FF00004D" 02 // 17 02 responds with // 02 17 30 30 30 30 02 // 14 02 responds with // 02 14 00 10 10 10 10 02 for (int i=0 ; i<256; i++) { if (i==0x11) continue; printf("sending %02x 02\n", i); SendCommand(hPort, 3, 0x02, i, 0x02); Sleep(200); printf("sending %02x aa 01 00 02\n", i); SendCommand(hPort, 6, 0x02, i, 0xaa, 0x01, 0x00, 0x02); Sleep(200); printf("sending %02x at%%ureg?0,4 02\n", i); SendCommand(hPort, 4, 0x02, i, "at%%ureg?0,4\r", 0x02); Sleep(200); } /* // from 0x4c it starts responding with '02 06 01' and 'aa 05 00 00 02' for (int i=0 ; i<256 ; i++) { } for (int i=0 ; i<256 ; i++) { } */ CloseHandle(hPort); return 0; } HANDLE OpenComport(char *portname) { return CreateFile (portname, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, 0, NULL); } bool SetCommParams(HANDLE hPort, int speed, int bits, int parity, int stopbits) { DCB dcb; dcb.DCBlength= sizeof(DCB); if (!GetCommState (hPort, &dcb)) return FALSE; dcb.BaudRate= speed; dcb.ByteSize= (BYTE)bits; dcb.Parity= (BYTE)parity; dcb.StopBits= (BYTE)stopbits; dcb.fOutxCtsFlow= 0; dcb.fDtrControl= DTR_CONTROL_ENABLE; dcb.fRtsControl= 0; dcb.fAbortOnError= 0; if (!SetCommState (hPort, &dcb)) return FALSE; COMMTIMEOUTS to; if (!GetCommTimeouts(hPort, &to)) return FALSE; to.ReadIntervalTimeout = 0; to.ReadTotalTimeoutMultiplier = 0; to.ReadTotalTimeoutConstant = 200; to.WriteTotalTimeoutMultiplier = 0; to.WriteTotalTimeoutConstant = 20000; if (!SetCommTimeouts(hPort, &to)) return FALSE; SetCommMask(hPort, EV_RXCHAR); SetupComm(hPort, 0x200, 0xffff); return TRUE; } bool vWriteData(HANDLE hPort, int nChars, va_list ap); bool SendCommand(HANDLE hPort, int nChars, ...) { va_list ap; va_start(ap, nChars); bool res= vWriteData(hPort, nChars, ap) ; va_end(ap); Sleep(200); BYTE buf[1024]; int n; n= ReadData(hPort, buf, 1024); debug("%hs\n", hexdump(0, buf, n, 1, 16).c_str()); return res; } bool WriteData(HANDLE hPort, int nChars, ...) { va_list ap; va_start(ap, nChars); bool res= vWriteData(hPort, nChars, ap) ; va_end(ap); return res; } bool vWriteData(HANDLE hPort, int nChars, va_list ap) { for (int i=0 ; i=0) { BYTE c= (BYTE)arg; if (!WriteFile(hPort, &c, 1, &nWritten, NULL)) { error("error writing char %02x", c); return FALSE; } if (nWritten!=1) { debug("did not write char %02x", c); return FALSE; } } else { BYTE* p= (BYTE*)arg; if (!WriteFile(hPort, p, strlen((char*)p), &nWritten, NULL)) { error("error writing char %hs", p); return FALSE; } if (nWritten!=strlen((char*)p)) { debug("did not write char %hs", p); return FALSE; } } } return TRUE; } int ReadData(HANDLE hPort, BYTE *buffer, int bufsize) { DWORD nRead; if (ReadFile(hPort, buffer, bufsize, &nRead, NULL)) return nRead; return -1; }