void ProcessCmd(char *cmd) { // cmd is one char, dest address 1 byte, data follows // we already know address is ours here switch(cmd[0]) { case 'W': // queue new work if( Status.WorkQC < MAX_WORK_COUNT-1 ) { WorkQue[ (WorkNow + Status.WorkQC) & WORKMASK ] = *(WORKTASK *)(cmd+2); if(Status.WorkQC++ == 0) { AsicPreCalc(&WorkQue[WorkNow]); AsicPushWork(); } } SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'A': // abort work, reply with hash completion count Status.WorkQC = WorkNow = 0; WorkQue[ (WorkNow + Status.WorkQC++) & WORKMASK ] = *(WORKTASK *)(cmd+2); AsicPreCalc(&WorkQue[WorkNow]); AsicPushWork(); SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'I': // return identity SendCmdReply(cmd, (char *)&ID, sizeof(ID)); break; case 'S': // return status SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'C': // set config values if( cmd[2] != 0 ) { Cfg = *(WORKCFG *)(cmd+2); if(Cfg.HashClock < MIN_HASH_CLOCK) Cfg.HashClock = MIN_HASH_CLOCK; if(Cfg.HashClock > MAX_HASH_CLOCK) Cfg.HashClock = MAX_HASH_CLOCK; ClockCfg[0] = ((DWORD)Cfg.HashClock << 18) | 0x00000003; HashTime = 256-(TICK_FACTOR/Cfg.HashClock); PWM1DCH = Cfg.FanTarget; } SendCmdReply(cmd, (char *)&Cfg, sizeof(Cfg)); break; case 'E': // enable/disable work HASH_CLK_EN = (cmd[2] == '1'); Status.State = (cmd[2] == '1') ? 'R' : 'D'; SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'Z': //I2CDetect(); SendCmdReply(cmd, (char *)&I2CState, sizeof(I2CState)); // case 'D': // detect asics // DetectAsics(); // SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; default: break; } LED_On(); }
void ProcessCmd(char *cmd) { // cmd is one char, dest address 1 byte, data follows // we already know address is ours here switch(cmd[0]) { case 'W': // queue new work if( Status.WorkQC < MAX_WORK_COUNT-1 ) { WorkQue[ (WorkNow + Status.WorkQC++) & WORKMASK ] = *(WORKTASK *)(cmd+2); if(Status.State == 'R') { AsicPreCalc(&WorkQue[WorkNow]); AsicPushWork(); } } SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'A': // abort work, reply status has hash completed count Status.WorkQC = WorkNow = 0; Status.State = 'R'; SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'I': // return identity SendCmdReply(cmd, (char *)&ID, sizeof(ID)); break; case 'S': // return status SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'C': // set config values if( *(WORD *)&cmd[2] != 0 ) { Cfg = *(WORKCFG *)(cmd+2); if(Cfg.HashClock < MIN_HASH_CLOCK) Cfg.HashClock = MIN_HASH_CLOCK; if(Cfg.HashClock <= HALF_HASH_CLOCK && Cfg.HashClock >= MAX_HASH_CLOCK/2) Cfg.HashClock = MAX_HASH_CLOCK/2-1; if(Cfg.HashClock >= MAX_HASH_CLOCK) Cfg.HashClock = MAX_HASH_CLOCK-1; if(Cfg.HashClock <= HALF_HASH_CLOCK) ClockCfg[0] = (((DWORD)Cfg.HashClock*2) << 18) | CLOCK_HALF_CHG; else ClockCfg[0] = ((DWORD)Cfg.HashClock << 18) | CLOCK_LOW_CHG; HashTime = 256-((DWORD)TICK_FACTOR/Cfg.HashClock); PWM1DCH = Cfg.FanTarget; } SendCmdReply(cmd, (char *)&Cfg, sizeof(Cfg)); break; case 'E': // enable/disable work HASH_CLK_EN = (cmd[2] == '1'); Status.State = (cmd[2] == '1') ? 'R' : 'D'; SendCmdReply(cmd, (char *)&Status, sizeof(Status)); break; case 'D': SendCmdReply(cmd, (char *)&HashTime, sizeof(HashTime)); default: break; } LED_On(); }
void AsicPushWork(void) { Status.WorkID = WorkQue[WorkNow].WorkID; SendAsicData(&WorkQue[WorkNow], DATA_SPLIT); Status.HashCount = 0; Status.State ='W'; TMR0 = HashTime; if(Status.WorkQC > 0) AsicPreCalc(&WorkQue[WorkNow]); }
void AsicPushWork(void) { Status.WorkID = WorkQue[WorkNow].WorkID; SendAsicData(&WorkQue[WorkNow], DATA_SPLIT); WorkNow = (WorkNow+1) & WORKMASK; Status.HashCount = 0; Status.State ='W'; RESET_RX(); if(--Status.WorkQC > 0) AsicPreCalc(&WorkQue[WorkNow]); }
void DetectAsics(void) { BankSize = 8; Status.ChipCount = 0; for(BYTE x = 0; x < BankSize; x++) NonceRanges[x] = StartNonce; AsicPreCalc(&TestWork); WorkQue[MAX_WORK_COUNT-1] = TestWork; SendAsicData(&WorkQue[MAX_WORK_COUNT-1], (StartNonce & 0x80000000) ? DATA_ONE : DATA_ZERO); // wait for "push work time" for results to return and be counted Status.ChipCount = 16; // just for now // pre-calc nonce range values BankSize = (Status.ChipCount+1)/2; WorkTicks = WORK_TICKS / BankSize; NonceRanges[0] = 0; for(BYTE x = 1; x < BankSize; x++) NonceRanges[x] = NonceRanges[x-1] + BankRanges[BankSize-1]; Status.State ='R'; Status.HashCount = 0; }
void DetectAsics(void) { BankSize = 8; Status.ChipCount = 0; for(BYTE x = 0; x < BankSize; x++) NonceRanges[x] = StartNonce; WorkQue[0] = TestWork; AsicPreCalc(&WorkQue[0]); //SendAsicData(&WorkQue[0], (StartNonce & 0x80000000) ? DATA_ONE : DATA_ZERO); // wait for "push work time" for results to return and be counted Status.ChipCount = 2; // just for testing // pre-calc nonce range values BankSize = Status.ChipCount; //(Status.ChipCount+1)/2; Status.MaxCount = WORK_TICKS / BankSize; NonceRanges[0] = 0; for(BYTE x = 1; x < BankSize; x++) NonceRanges[x] = NonceRanges[x-1] + BankRanges[BankSize-1]; Status.State ='R'; Status.HashCount = 0; }