in meta-portwell/meta-pwneptune/recipes-neptune/plat-libs/files/cpld/lattice.c [1151:1575]
int lcmxo2_2000hc_cpld_program(FILE *jed_fd)
{
int i;
unsigned int tdo = 0;
unsigned int *dr_data;
//file
unsigned int *jed_data;
unsigned int row = 0;
int cmp_err = 0;
dr_data = malloc(((424/32) + 1) * sizeof(unsigned int));
jed_data = malloc(((cur_dev->dr_bits/32) + 1) * sizeof(unsigned int));
//RUNTEST IDLE 15 TCK 1.00E-003 SEC;
ast_jtag_run_test_idle( 0, 0, 3);
//! Check the IDCODE_PUB
//SIR 8 TDI (E0);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, LCMXO2_IDCODE_PUB);
//SDR 32 TDI (00000000)
// TDO (01285043)
// MASK (FFFFFFFF);
dr_data[0] = 0x00000000;
ast_jtag_tdo_xfer( 0, 32, dr_data);
if(dr_data[0] != 0x12BB043) {
if (debug)
printf("ID Fail : %08x [0x012BB043] \n",dr_data[0]);
return -1;
}
//! Program Bscan register
//! Shift in Preload(0x1C) instruction
//SIR 8 TDI (1C);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x1C);
//SDR 424 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
memset(dr_data, 0xff, (424/32 + 1) * sizeof(unsigned int));
ast_jtag_tdi_xfer( 0, 424, dr_data);
//! Enable the Flash (Transparent Mode)
//! Shift in ISC ENABLE X (0x74) instruction
//SIR 8 TDI (74);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x74);
//SDR 8 TDI (00);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
dr_data[0] = 0x00;
ast_jtag_tdi_xfer(0, 8, dr_data);
usleep(3000);
//! Shift in ISC ERASE(0x0E) instruction
//SIR 8 TDI (0E);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x0E);
//SDR 8 TDI (01);
//RUNTEST IDLE 2 TCK 1.00E+000 SEC;
dr_data[0] = 0x01;
ast_jtag_tdi_xfer(0, 8, dr_data);
usleep(1000);
//! Shift in BYPASS(0xFF) instruction
//SIR 8 TDI (FF)
// TDO (00)
// MASK (C0);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, BYPASS);
//! Shift in ISC ENABLE X (0x74) instruction
//SIR 8 TDI (74);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x74);
//SDR 8 TDI (08);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
dr_data[0] = 0x08;
ast_jtag_tdi_xfer( 0, 8, dr_data);
usleep(3000);
//! Check the Key Protection fuses
//! Shift in LSC_READ_STATUS(0x3C) instruction
//SIR 8 TDI (3C);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x3C);
usleep(3000);
//SDR 32 TDI (00000000)
// TDO (00000000)
// MASK (00024040);
dr_data[0] = 0x00000000;
ast_jtag_tdo_xfer( 0, 32, dr_data);
//! Shift in LSC_READ_STATUS(0x3C) instruction
//SIR 8 TDI (3C);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x3C);
usleep(3000);
//SDR 32 TDI (00000000)
// TDO (00000000)
// MASK (00010000);
dr_data[0] = 0x00000000;
ast_jtag_tdo_xfer(0, 32, dr_data);
//! Erase the Flash
//! Shift in ISC ERASE(0x0E) instruction
//SIR 8 TDI (0E);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x0E);
//SDR 8 TDI (0E);
//RUNTEST IDLE 2 TCK;
dr_data[0] = 0x0E;
ast_jtag_tdi_xfer( 0, 8, dr_data);
//! Shift in LSC_CHECK_BUSY(0xF0) instruction
//SIR 8 TDI (F0);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xF0);
//LOOP 800 ;
//RUNTEST IDLE 2 TCK 1.00E-002 SEC;
//SDR 1 TDI (0)
// TDO (0);
//ENDLOOP ;
dr_data[0] = 0;
for(i = 0; i <800 ; i++) {
usleep(2000);
ast_jtag_tdo_xfer( 0, 1, dr_data);
}
//! Read the status bit
//! Shift in LSC_READ_STATUS(0x3C) instruction
//SIR 8 TDI (3C);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x3C);
usleep(3000);
//SDR 32 TDI (00000000)
// TDO (00000000)
// MASK (00003000);
dr_data[0] = 0x00000000;
ast_jtag_tdo_xfer(0, 32, dr_data);
if(dr_data[0] != 0x0) {
if (debug)
printf("%x [0x0]\n", dr_data[0]);
}
if (debug)
printf("Erase Done \n");
fseek(jed_fd, 0, SEEK_SET);
jed_file_parse_header(jed_fd);
//! Program CFG
if (debug)
printf("Program CFG \n");
//! Shift in LSC_INIT_ADDRESS(0x46) instruction
//SIR 8 TDI (46);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x46);
//SDR 8 TDI (04);
//RUNTEST IDLE 2 TCK 1.00E-002 SEC;
dr_data[0] = 0x04;
ast_jtag_tdo_xfer(0, 32, dr_data);
if (debug)
printf("Program 3198 .. \n");
// mode = SW_MODE;
for(row =0 ; row < cur_dev->row_num; row++) {
memset(dr_data, 0, (cur_dev->dr_bits/32) * sizeof(unsigned int));
jed_file_parser(jed_fd, cur_dev->dr_bits, dr_data);
//! Shift in LSC_PROG_INCR_NV(0x70) instruction
//SIR 8 TDI (70);
ast_jtag_sir_xfer(1, LATTICE_INS_LENGTH, 0x70);
//! Shift in Data Row = 1
//SDR 128 TDI (120600000040000000DCFFFFCDBDFFFF);
//RUNTEST IDLE 2 TCK;
ast_jtag_tdi_xfer(0, cur_dev->dr_bits, dr_data);
usleep(1000);
//! Shift in LSC_CHECK_BUSY(0xF0) instruction
//SIR 8 TDI (F0);
ast_jtag_sir_xfer(1, LATTICE_INS_LENGTH, 0xF0);
//LOOP 10 ;
//RUNTEST IDLE 1.00E-003 SEC;
//SDR 1 TDI (0)
// TDO (0);
//ENDLOOP ;
for(i = 0;i < 10; i++) {
usleep(3000);
dr_data[0] = 0;
ast_jtag_tdo_xfer(0, 1, dr_data);
if(dr_data[0] == 0) break;
}
if(dr_data[0] != 0) {
if (debug)
printf("row %d, Fail [%d] \n", row, dr_data[0]);
} else {
if (debug)
printf(".");
}
}
// mode = HW_MODE;
//! Program the UFM
if (debug)
printf("Program the UFM : 640\n");
//! Shift in LSC_INIT_ADDR_UFM(0x47) instruction
//SIR 8 TDI (47);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x47);
for(row =0 ; row < 640; row++) {
memset(dr_data, 0, (cur_dev->dr_bits/32) * sizeof(unsigned int));
jed_file_parser(jed_fd, cur_dev->dr_bits, dr_data);
//! Shift in LSC_PROG_INCR_NV(0x70) instruction
//SIR 8 TDI (70);
ast_jtag_sir_xfer(1, LATTICE_INS_LENGTH, 0x70);
//! Shift in Data Row = 1
//SDR 128 TDI (00000000000000000000000000000000);
//RUNTEST IDLE 2 TCK;
ast_jtag_tdi_xfer(0, cur_dev->dr_bits, dr_data);
//! Shift in LSC_CHECK_BUSY(0xF0) instruction
//SIR 8 TDI (F0);
ast_jtag_sir_xfer(1, LATTICE_INS_LENGTH, 0xF0);
//LOOP 10 ;
//RUNTEST IDLE 1.00E-003 SEC;
//SDR 1 TDI (0)
// TDO (0);
//ENDLOOP ;
for(i = 0;i < 10; i++) {
usleep(3000);
dr_data[0] = 0;
ast_jtag_tdo_xfer(0, 1, dr_data);
if(dr_data[0] == 0) break;
}
if(dr_data[0] != 0) {
if (debug)
printf("row %d, Fail [%d] \n",row, dr_data[0]);
} else {
if (debug)
printf(".");
}
}
//! Program USERCODE
//! Shift in READ USERCODE(0xC0) instruction
//SIR 8 TDI (C0);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xC0);
//SDR 32 TDI (00000000);
dr_data[0] = 0x00000000;
ast_jtag_tdi_xfer(0, 32, dr_data);
//! Shift in ISC PROGRAM USERCODE(0xC2) instruction
//SIR 8 TDI (C2);
//RUNTEST IDLE 2 TCK 1.00E-002 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xC2);
usleep(2000);
//! Read the status bit
//! Shift in LSC_READ_STATUS(0x3C) instruction
//SIR 8 TDI (3C);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x3C);
//SDR 32 TDI (00000000)
// TDO (00000000)
// MASK (00003000);
dr_data[0] = 0x00000000;
ast_jtag_tdo_xfer(0, 32, dr_data);
//! Program Feature Rows
//! Shift in LSC_INIT_ADDRESS(0x46) instruction
//SIR 8 TDI (46);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x46);
//SDR 8 TDI (02);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
dr_data[0] = 0x02;
ast_jtag_tdi_xfer(0, 8, dr_data);
usleep(3000);
//! Shift in LSC_PROG_FEATURE(0xE4) instruction
//SIR 8 TDI (E4);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xE4);
//SDR 64 TDI (0000000000000000);
//RUNTEST IDLE 2 TCK;
dr_data[0] = 0x00000000;
dr_data[1] = 0x00000000;
ast_jtag_tdi_xfer(0, 64, dr_data);
//! Shift in LSC_CHECK_BUSY(0xF0) instruction
//SIR 8 TDI (F0);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xF0);
//LOOP 10 ;
//RUNTEST IDLE 1.00E-003 SEC;
//SDR 1 TDI (0)
// TDO (0);
//ENDLOOP ;
for(i = 0;i < 10; i++) {
usleep(3000);
dr_data[0] = 0;
ast_jtag_tdo_xfer(0, 1, dr_data);
}
//! Shift in LSC_READ_FEATURE (0xE7) instruction
//SIR 8 TDI (E7);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xE7);
//SDR 64 TDI (0000000000000000)
// TDO (0000000000000000);
dr_data[0] = 0x00000000;
dr_data[1] = 0x00000000;
ast_jtag_tdo_xfer(0, 64, dr_data);
//! Shift in in LSC_PROG_FEABITS(0xF8) instruction
//SIR 8 TDI (F8);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xF8);
//SDR 16 TDI (0620);
//RUNTEST IDLE 2 TCK;
dr_data[0] = 0x0620;
ast_jtag_tdi_xfer(0, 16, dr_data);
//! Shift in LSC_CHECK_BUSY(0xF0) instruction
//SIR 8 TDI (F0);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xF0);
//LOOP 10 ;
//RUNTEST IDLE 1.00E-003 SEC;
//SDR 1 TDI (0)
// TDO (0);
//ENDLOOP ;
for(i = 0;i < 10; i++) {
usleep(3000);
dr_data[0] = 0;
ast_jtag_tdo_xfer(0, 1, dr_data);
}
//! Shift in in LSC_READ_FEABITS(0xFB) instruction
//SIR 8 TDI (FB);
//RUNTEST IDLE 2 TCK 1.00E-003 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xFB);
//SDR 16 TDI (0000)
// TDO (0620)
// MASK (FFF2);
dr_data[0] = 0x0;
ast_jtag_tdo_xfer(0, 16, dr_data);
//! Program DONE bit
//! Shift in ISC PROGRAM DONE(0x5E) instruction
//SIR 8 TDI (5E);
//RUNTEST IDLE 2 TCK;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x5E);
//! Shift in LSC_CHECK_BUSY(0xF0) instruction
//SIR 8 TDI (F0);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xF0);
//LOOP 10 ;
//RUNTEST IDLE 1.00E-003 SEC;
//SDR 1 TDI (0)
// TDO (0);
//ENDLOOP ;
for(i = 0;i < 10; i++) {
usleep(3000);
dr_data[0] = 0;
ast_jtag_tdo_xfer(0, 1, dr_data);
}
//! Shift in BYPASS(0xFF) instruction
//SIR 8 TDI (FF)
// TDO (04)
// MASK (C4);
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xFF);
//! Exit the programming mode
//! Shift in ISC DISABLE(0x26) instruction
//SIR 8 TDI (26);
//RUNTEST IDLE 2 TCK 1.00E+000 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0x26);
//! Shift in BYPASS(0xFF) instruction
//SIR 8 TDI (FF)//;
//RUNTEST IDLE 2 TCK 1.00E-001 SEC;
ast_jtag_sir_xfer(0, LATTICE_INS_LENGTH, 0xFF);
free(jed_data);
free(dr_data);
return 0;
}