int SDEBUG_CMDLARGEParser(struct SerialPortConfigProfile *pSPConfig) { SerialPortConfigProfile_t *SP = (struct SerialPortConfigProfile *)pSPConfig; unsigned long value = 0; unsigned int RegAddr = 0; switch(SP->RequestPacket[2]) { //FF 0E 01 68 05 00 00 00 "00" 00 00 03 31 51 00->0ffset //FF 0E 00 68 05 00 00 00 "1B" 00 00 00 22 49 00->Offset case READ: if(SP->RequestPacket[3] == SPV9200ADDR) { RegAddr = SP->RegBankAddr + SP->RequestPacket[8] * 4; if(SP->UioDevice->uioReadCount > 256) { SDEBUG_UioClose(SP); SDEBUG_UioOpen(SP); SP->UioDevice->uioReadCount = 0; } SDEBUG_UioRead(SP, CMDLARGE, RegAddr, &value); SP->UioDevice->uioReadCount++; printf("RegAddr : 0x%x\n",RegAddr + BASE_PHY_ADDR); printf("read value: 0x%lX\n",value); printf("read count: %u\n",SP->UioDevice->uioReadCount); SDEBUG_WriteRegValueCMD(SP, SP->ttyFD, CMDLARGE, value); } break; case WRITE: if(SP->RequestPacket[3] == SPV9200ADDR) { RegAddr = SP->RegBankAddr + SP->RequestPacket[8] * 4; if(SP->UioDevice->uioReadCount > 256) { SDEBUG_UioClose(SP); SDEBUG_UioOpen(SP); SP->UioDevice->uioReadCount = 0; } value = (SP->RequestPacket[9] << 24) + (SP->RequestPacket[10] << 16) + (SP->RequestPacket[11] << 8) +SP->RequestPacket[12]; SDEBUG_UioWrite(SP, CMDLARGE, RegAddr, value); SP->UioDevice->uioReadCount++; printf("RegAddr : 0x%x\n",RegAddr + BASE_PHY_ADDR); printf("write value: 0x%2lX\n",value); printf("read count: %u\n",SP->UioDevice->uioReadCount); //SDEBUG_WriteRegValueCMD(SP, SP->ttyFD, CMDLARGE, value); SDEBUG_WriteFF01CMD(SP->ttyFD); } break; case REGTYPE: // don't need to implement this type break; } return 0; }
int main(int argc, char *argv[]) { int opt; int Daemon_mode; struct SerialPortConfigProfile pTTYConfig; memset(&pTTYConfig,0,sizeof(struct SerialPortConfigProfile)); // parser option setting while((opt = getopt(argc, argv, "n:dh")) != -1) { switch(opt) { case 'd': Daemon_mode = 1; break; case 'h': SDEBUG_Usage(); break; case 'n': if(strlen(optarg) == 0) { exit(1); }else{ printf("tty name: %s\n", optarg); strcpy(pTTYConfig.ttyName,optarg); } break; case ':': printf("option needs a value\n"); break; case '?': SDEBUG_Usage(); exit(1); break; } } // default tty name is /dev/ttyS0 if(strlen(pTTYConfig.ttyName) == 0) { strcpy(pTTYConfig.ttyName,TTYNAME); } if( SDEBUG_Init(&pTTYConfig) == -1) { perror("Initial fail\n"); exit(1); } // open device if(SDEBUG_OpenDevice(&pTTYConfig) == -1) { perror("open device fail\n"); exit(1); } // get tty config if(SDEBUG_GetTTYConfig(&pTTYConfig) == -1) { perror("get tty config fail\n"); exit(1); } // set tty config if(SDEBUG_SetTTYConfig(&pTTYConfig) == -1) { perror("set tty config fail\n"); exit(1); } // uio device open SDEBUG_UioOpen(&pTTYConfig); // Sdebug CMD parser while(1) { if(SDEBUG_ReadRequestCMD(&pTTYConfig, pTTYConfig.ttyFD) == -1) break; if(SDEBUG_CMDParser(&pTTYConfig) == -1) { printf("cmd parser fail\n"); } } // restore ttyS0 for console SDEBUG_RestoreTTYSetting(&pTTYConfig); // close device if(SDEBUG_CloseDevice(&pTTYConfig) == -1) { perror("open device fail\n"); exit(1); } // uio device close SDEBUG_UioClose(&pTTYConfig); // release memory SDEBUG_Release(&pTTYConfig); return 0; }
// for sdebug 4.5.1.1 int SDEBUG_CMDSMALLParser(struct SerialPortConfigProfile *pSPConfig) { SerialPortConfigProfile_t *SP = (struct SerialPortConfigProfile *)pSPConfig; unsigned long value = 0; unsigned int RegAddr = 0; switch(SP->RequestPacket[2]) { case READ: //FF 0A 00 68 0C "00 1A" "00 FF" 6A => offset "00 1A" ,write value "00 FF" if(SP->RequestPacket[3] == SPV9200ADDR) { RegAddr = SP->RegBankAddr + (SP->RequestPacket[6] * 4); if(SP->UioDevice->uioReadCount > 256) { SDEBUG_UioClose(SP); SDEBUG_UioOpen(SP); SP->UioDevice->uioReadCount = 0; } SDEBUG_UioRead(SP, CMDLARGE, RegAddr, &value); SP->UioDevice->uioReadCount++; printf("RegAddr : 0x%x\n",RegAddr + BASE_PHY_ADDR); printf("read value: 0x%lX\n",value); //printf("read count: %u\n",SP->UioDevice->uioReadCount); SDEBUG_WriteRegValueCMD(SP, SP->ttyFD, CMDLARGE, value); } break; case WRITE: //FF 0A 00 68 0C "00 1A" "00 FF" 6A => offset "00 1A" ,write value "00 FF" if(SP->RequestPacket[3] == SPV9200ADDR) { RegAddr = SP->RegBankAddr + SP->RequestPacket[6] * 4; if(SP->UioDevice->uioReadCount > 256) { SDEBUG_UioClose(SP); SDEBUG_UioOpen(SP); SP->UioDevice->uioReadCount = 0; } value = (SP->RequestPacket[7] << 8) +SP->RequestPacket[8]; SDEBUG_UioWrite(SP, CMDSMALL, RegAddr, value); SP->UioDevice->uioReadCount++; //printf("RegAddr : 0x%x\n",RegAddr + BASE_PHY_ADDR); //printf("write value: 0x%2lX\n",value); //printf("read count: %u\n",SP->UioDevice->uioReadCount); //SDEBUG_WriteRegValueCMD(SP, SP->ttyFD, CMDSMALL, value); SDEBUG_WriteFF01CMD(SP->ttyFD); } break; case REGTYPE: //FF 0A 02 68 0C 00 FF "01 89" F8 => group 393 if(SP->RequestPacket[3] == SPV9200ADDR) { if(SP->RequestPacket[4] == 0x00) //Bank00 ~ Bank11 { // Uio map is from 0xBFFE0000 to 0xBFFEF000 SP->RegBankAddr = ((SP->RequestPacket[7] << 8) + SP->RequestPacket[8]) * 0x400 + (BANK00 - BASE_PHY_ADDR) ; } else if(SP->RequestPacket[4] == 0x0C) //Group00 ~ Group255 { SP->RegBankAddr = ((SP->RequestPacket[7] << 8) + SP->RequestPacket[8]) * 0x80; } SDEBUG_WriteFF01CMD(SP->ttyFD); // write 0xff 0x01 to ask next packet } break; default: printf("no this type\n"); break; } return 0; }
int SDEBUG_CMDTINYParser(struct SerialPortConfigProfile *pSPConfig) { SerialPortConfigProfile_t *SP = (struct SerialPortConfigProfile *)pSPConfig; unsigned long value = 0; unsigned int RegAddr = 0; switch(SP->RequestPacket[2]) { case READ: if(SP->RequestPacket[3] == SPV9200ADDR) { RegAddr = SP->RegBankAddr + SP->RequestPacket[5] * 4; if(SP->UioDevice->uioReadCount > 256) { SDEBUG_UioClose(SP); SDEBUG_UioOpen(SP); SP->UioDevice->uioReadCount = 0; } SDEBUG_UioRead(SP, CMDTINY, RegAddr, &value); SP->UioDevice->uioReadCount++; printf("RegAddr : 0x%x\n",RegAddr + BASE_PHY_ADDR); printf("read value: 0x%lX\n",value); printf("read count: %u\n",SP->UioDevice->uioReadCount); SDEBUG_WriteRegValueCMD(SP, SP->ttyFD, CMDTINY, value); } break; case WRITE: if(SP->RequestPacket[3] == SPV9200ADDR) { RegAddr = SP->RegBankAddr + SP->RequestPacket[5] * 4; if(SP->UioDevice->uioReadCount > 256) { SDEBUG_UioClose(SP); SDEBUG_UioOpen(SP); SP->UioDevice->uioReadCount = 0; } value = SP->RequestPacket[6]; SDEBUG_UioWrite(SP, CMDTINY, RegAddr, value); SP->UioDevice->uioReadCount++; printf("RegAddr : 0x%x\n",RegAddr + BASE_PHY_ADDR); printf("write value: 0x%lX\n",value); printf("read count: %u\n",SP->UioDevice->uioReadCount); SDEBUG_WriteRegValueCMD(SP, SP->ttyFD, CMDTINY, value); SDEBUG_WriteFF01CMD(SP->ttyFD); } break; case REGTYPE: //FF 08 02 68 "00" FF "00" 90 => 00->Bank type, 00-> bank number //FF 08 02 68 "05" FF "00" 8B => 05->group, 00-> group number if(SP->RequestPacket[3] == SPV9200ADDR) { if(SP->RequestPacket[4] == 0x00) //Bank00 ~ Bank11 { // Uio map is from 0xBFFE0000 to 0xBFFEF000 SP->RegBankAddr = SP->RequestPacket[6] * 0x400 + (BANK00 - BASE_PHY_ADDR) ; } else if(SP->RequestPacket[4] == 0x05) //Group00 ~ Group255 { SP->RegBankAddr = SP->RequestPacket[6] * 0x80; } SDEBUG_WriteFF01CMD(SP->ttyFD); // write 0xff 0x01 to ask next packet } break; } return 0; }