int lcmxo2_2000hc_cpld_program()

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;

}