// AtmelProgrammer.cpp// #include #include #include using namespace std; void PrintLastError(void); int HexToInt(char* string); bool ReadBytes(HANDLE hCom, char* buffer, int numBytes, int timeout); int _tmain(int argc, _TCHAR* argv[]) { HANDLE hCom; FILE *hFile; DCB dcb; long lInst; int i, iFlashSize, iBootSize, iStartAddr; OFSTRUCT ofs; LPTSTR lpBuffer; char readbuffer[256], writebuffer[256], *instbuffer; DWORD readsize,writesize; for (i = 0; i < 256; i++) { writebuffer[i] = readbuffer[i] = 0; } iStartAddr = 0x1234; hCom = CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); if (hCom == INVALID_HANDLE_VALUE) { PrintLastError(); exit(0); } //hFile = (HANDLE)OpenFile("E:/Documents and Settings/Nicholas Clark/My Documents/Cornell - Spring 2005/ECE 476/lab1.rom", &ofs, OF_READ); printf("\r\n%s\r\n", argv[1]); hFile = fopen(argv[1], "r"); GetCommState(hCom, &dcb); dcb.BaudRate = CBR_19200; // set the baud rate dcb.ByteSize = 8; // data size, xmit, and rcv dcb.Parity = NOPARITY; // no parity bit dcb.StopBits = ONESTOPBIT; // one stop bit SetCommState(hCom, &dcb); /*for (int i = 1; i < 255; i++) { writebuffer[0] = i; writebuffer[1] = 0; printf("writing %d\r\n", i); WriteFile(hCom, writebuffer, 1, &writesize, NULL); ReadBytes(hCom, readbuffer, 1, 100000); Sleep(100); } scanf("\r\n");*/ fseek (hFile , 0 , SEEK_END); lInst = ftell(hFile) / 13; printf("#inst: %d\r\n", lInst); rewind(hFile); // send the hello sprintf(writebuffer, "+"); WriteFile(hCom, writebuffer, 1, &writesize, NULL); // get the hello ReadBytes(hCom, readbuffer, 1, 10000); printf("%c\r\n", readbuffer[0]); // send the length writebuffer[0] = (lInst >> 8); writebuffer[1] = (lInst >> 0); writebuffer[2] = 0; WriteFile(hCom, writebuffer, 2, &writesize, NULL); // get the OK to write ReadBytes(hCom, readbuffer, 1, 10000); printf("%c\r\n", readbuffer[0]); // start sending the instructions i = 0; while (fread(&readbuffer, 1, 12, hFile) == 12) { ++i; readbuffer[11] = 0; int temp = HexToInt(&readbuffer[7]); char cbuff[15]; sprintf(cbuff, "%s", &readbuffer[7]); writebuffer[0] = (temp >> 8) & 0xFF; writebuffer[1] = (temp >> 0) & 0xFF; writebuffer[2] = 0; // Send the instruction to the mega32 WriteFile(hCom, writebuffer, 2, &writesize, NULL); FlushFileBuffers(hCom); // Wait for acknowledgement ReadBytes(hCom, readbuffer, 1, 10000); switch (readbuffer[0]) { case '+' : default : // everything is ok printf("Success writing instruction #%d [%s]\r\n", i, cbuff); break; case '-' : // there was an error, try it again fseek(hFile, -12, SEEK_CUR); printf("Error writing instruction #%d [%s]\r\n", i, cbuff); break; } } fclose(hFile); // send the Finished writebuffer[0] = 0x01; writebuffer[1] = 0xFF; writebuffer[2] = 0; WriteFile(hCom, writebuffer, 2, &writesize, NULL); CloseHandle(hCom); return 0; } // not sure if ReadFile is blocking..If it is not, we need to poll bool ReadBytes(HANDLE hCom, char* readbuffer, int numBytes, int timeout) { int i = 0; DWORD readsize; do { if (i > 0) Sleep(500); ReadFile(hCom, readbuffer, 1, &readsize, NULL); } while (readsize != numBytes && ++i < timeout); return (i < timeout); } int HexToInt(char* string) { int temp = 0; int i = 0; //printf("hextoint: %s\r\n", string); while (string[i]) { char ch = string[i]; //printf("hextoint: %c\r\n", ch); if (ch >= 'A' && ch <= 'F') { ch = ch - 'A' + 10; } else if (ch >= 'a' && ch <= 'f') { ch = ch - 'a' + 10; } else { ch = ch - '0'; } //printf("hextoint: %d\r\n", ch); temp = (temp << 4) | (ch & 0xF); ++i; } return temp; } void PrintLastError() { LPTSTR lpBuffer; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_USER_DEFAULT, (LPTSTR)&lpBuffer, 0, NULL ); cout << lpBuffer; }