示例#1
0
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();
}
示例#2
0
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();
}
示例#3
0
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]);
}
示例#4
0
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]);
}
示例#5
0
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;
}
示例#6
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;
}