void main (void) { uint8_t cfg; // in R7 uint8_t pin; // in R6 bSoftReset = 0; // timeout bWrProtect = 1; // FlashWrite forbitten bVerifyErr = 0; // new in V2.4 bChipTyp = CHIP_ID & 0x01 // 1 on CH559 EA = 0; TR0 = 0; TF0 = 0; //serial uart0 init SCON = 0x50; // mode1, 8Bit var baudrate + REN PCON |= SMOD; TMOD = (TMOD & 0x0F) | 0x20; // t1 mode 2 T2MOD |= bTMR_CLK | bT1_CLK; TH1 = 0xF3; // 56k6 bautrate @ fsys 12MHz TR1 = 1; TI = 0; // TI + RI are already 0 RI = 0; PIN_FUNC = bUART0_PIN_X; // read boot pin state cfg = CBYTE[0xFFFA]; // read the config byte if (cfg & 0x02) { if (P4_IN & bSCS_) pin = 0; // pin = 0 no boot pin else pin = 1; // pin = 1 boot on P4.6 low } else pin = P5_IN & pDP; // pin = 2 boot on P5.2 hi // // init USB on any of the following contitions: // - pin event // - chip is in bootmode // - flash is empty // if (((pin) || (GLOBAL_CFG & bBOOT_LOAD)) || ((CBYTE[0x0000]==0xFF) && (CBYTE[0x0001]==0xFF))) { if (CHIP_ID != 0x57) // never init USB on a CH557 { USB_CTRL = 0; UEP2_3_MOD = bUEP2_RX_EN | bUEP2_TX_EN; UEP0_DMA = EP0_BUFFER; UEP2_DMA = EP2_BUFFER; UDEV_CTRL = bUD_DP_PD_DIS | bUD_DM_PD_DIS; USB_CTRL = bUC_DEV_PU_EN | bUC_INT_BUSY |bUC_DMA_EN; UDEV_CTRL |= bUD_PORT_EN; USB_INT_FG = 0xFF; USB_INT_EN = bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST; } } else { if(cfg & 0x01) { TMOD |= 0x01; // T0 mode 1 TL0 = 0x64C0 & 0xFF; // timeout TH0 = 0x64C0 >> 8; } else bSoftReset = 1; } //init key for (i=0; i<8; i++) Key[i] = rand(); while(1) { if (bSoftReset) { SAFE_MOD = 0x55; SAFE_MOD = 0xAA; GLOBAL_CFG = bSW_RESET; // exit loader while(1); // wait for it } // check for rx events if (RI) { Marker0 = 0x96; SerialHandler(); } //check for usb events if (USB_INT_FG & 0x07) { Marker0 = 0x96; UsbHandler(); } // check for timeout event if (TF0) { SoftReset = 1; } } }