⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opensourcebdm_dll.c

📁 Freescale的S08BDM开发工具制作资料
💻 C
📖 第 1 页 / 共 2 页
字号:
		#else
			usb_data[0]=(MAX_DATA_SIZE&0xfe)-1+1;
			opensourcebdm_usb_recv_ep0(usb_data);
		#endif
		for (i=0;i<(MAX_DATA_SIZE&0xfe)-1;i++) *(data++) = usb_data[i+1];
		address += (MAX_DATA_SIZE&0xfe)-1;	/* update address */
		count -= (MAX_DATA_SIZE&0xfe)-1;	/* update count */
	}
	while (count>MAX_DATA_SIZE) {
		usb_data[1]=CMD_READ_BLOCK1;
		*((unsigned int*)(usb_data+2)) = address;
		usb_data[4]=(MAX_DATA_SIZE&0xfe);
		#ifdef FAST_BLOCK
			usb_data[0]=4;
			opensourcebdm_usb_send_ep2(usb_data);
			usb_data[0]=(MAX_DATA_SIZE&0xfe)+1;
			opensourcebdm_usb_recv_ep2(usb_data);
		#else
			usb_data[0]=(MAX_DATA_SIZE&0xfe)+1;
			opensourcebdm_usb_recv_ep0(usb_data);
		#endif
		for (i=0;i<(MAX_DATA_SIZE&0xfe);i++) *(data++) = usb_data[i+1];
		address += (MAX_DATA_SIZE&0xfe);	/* update address */
		count -= (MAX_DATA_SIZE&0xfe);		/* update count */
	}
	if (count) {
		usb_data[1]=CMD_READ_BLOCK1;
		*((unsigned int*)(usb_data+2)) = address;
		usb_data[4]=count;
		#ifdef FAST_BLOCK
			usb_data[0]=4;
			opensourcebdm_usb_send_ep2(usb_data);
			usb_data[0]=count+1;
			opensourcebdm_usb_recv_ep2(usb_data);
		#else
			usb_data[0]=count+1;
			opensourcebdm_usb_recv_ep0(usb_data);
		#endif
		for (i=0;i<count;i++) *(data++) = usb_data[i+1];
	}
}

/* writes block to memory */
void WINAPI __declspec(dllexport) opensourcebdm_write_block(unsigned int address, unsigned int count, unsigned char *data) {
	unsigned int i;
	if ((count>MAX_DATA_SIZE)&&(address&0x0001)) {
		/* if address is odd and we are going to write more than one block make the first packet 1 byte short to align the address */
		usb_data[0]=(MAX_DATA_SIZE&0xfe)-1+4;
		usb_data[1]=CMD_WRITE_BLOCK1;
		*((unsigned int*)(usb_data+2)) = address;
		usb_data[4]=(MAX_DATA_SIZE&0xfe)-1;
		for (i=0;i<(MAX_DATA_SIZE&0xfe)-1;i++) usb_data[i+5] = *(data++);
		#ifdef FAST_BLOCK
			opensourcebdm_usb_send_ep2(usb_data);	/* Tx data */
			usb_data[0]=1;					/* read status */
			opensourcebdm_usb_recv_ep2(usb_data);
		#else
			opensourcebdm_usb_send_ep0(usb_data);
		#endif
		address += (MAX_DATA_SIZE&0xfe)-1;	/* update address */
		count -= (MAX_DATA_SIZE&0xfe)-1;	/* update count */
	}
	while (count>MAX_DATA_SIZE) {
		usb_data[0]=(MAX_DATA_SIZE&0xfe)+4;
		usb_data[1]=CMD_WRITE_BLOCK1;
		*((unsigned int*)(usb_data+2)) = address;
		usb_data[4]=(MAX_DATA_SIZE&0xfe);
		for (i=0;i<(MAX_DATA_SIZE&0xfe);i++) usb_data[i+5] = *(data++);
		#ifdef FAST_BLOCK
			opensourcebdm_usb_send_ep2(usb_data);	/* Tx data */
			usb_data[0]=1;					/* read status */
			opensourcebdm_usb_recv_ep2(usb_data);
		#else
			opensourcebdm_usb_send_ep0(usb_data);
		#endif
		address += (MAX_DATA_SIZE&0xfe);	/* update address */
		count -= (MAX_DATA_SIZE&0xfe);		/* update count */
	}
	if (count) {
		usb_data[0]=count+4;
		usb_data[1]=CMD_WRITE_BLOCK1;
		*((unsigned int*)(usb_data+2)) = address;
		usb_data[4]=count;
		for (i=0;i<count;i++) usb_data[i+5] = *(data++);
		#ifdef FAST_BLOCK
			opensourcebdm_usb_send_ep2(usb_data);	/* Tx data */
			usb_data[0]=1;					/* read status */
			opensourcebdm_usb_recv_ep2(usb_data);
		#else
			opensourcebdm_usb_send_ep0(usb_data);
		#endif
	}
}

/* reads contents of core registers */
/* returns 0 on success and non-zero on failure */
unsigned char WINAPI __declspec(dllexport) opensourcebdm_read_regs(registers_t *registers) {

#if SELAHCS08

	usb_data[0]=9;	 //return 9
	usb_data[1]=CMD_READ_REGS;
	opensourcebdm_usb_recv_ep0(usb_data);
	registers->hcs08.pc = (*((unsigned int*)(usb_data+1)))&0xffff;
	registers->hcs08.sp = (*((unsigned int*)(usb_data+3)))&0xffff;
	registers->hcs08.hx = (*((unsigned int*)(usb_data+5)))&0xffff;
	registers->hcs08.a = (*((unsigned int*)(usb_data+7)))&0x00ff;
	registers->hcs08.ccr= (*((unsigned int*)(usb_data+8)))&0x00ff;
	return(!(usb_data[0]==CMD_READ_REGS));

#else

	usb_data[0]=13;	 // return 13 bytes
	usb_data[1]=CMD_READ_REGS;
	opensourcebdm_usb_recv_ep0(usb_data);
	registers->hc12.pc = (*((unsigned int*)(usb_data+1)))&0xffff;
	registers->hc12.sp = (*((unsigned int*)(usb_data+3)))&0xffff;
	registers->hc12.ix = (*((unsigned int*)(usb_data+5)))&0xffff;
	registers->hc12.iy = (*((unsigned int*)(usb_data+7)))&0xffff;
	registers->hc12.d  = (*((unsigned int*)(usb_data+9)))&0xffff;
	registers->hc12.ccr= (*((unsigned int*)(usb_data+11)))&0xffff;
	return(!(usb_data[0]==CMD_READ_REGS));

#endif

}

/* writes PC */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_pc(unsigned int value) {
	usb_data[0]=3;	 /* send 3 bytes */
	usb_data[1]=CMD_WRITE_REG_PC;
	*((unsigned int*)(usb_data+2)) = value;
	opensourcebdm_usb_send_ep0(usb_data);
}

/* writes SP */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_sp(unsigned int value) {
	usb_data[0]=3;	 /* send 3 bytes */
	usb_data[1]=CMD_WRITE_REG_SP;
	*((unsigned int*)(usb_data+2)) = value;
	opensourcebdm_usb_send_ep0(usb_data);
}

/* writes H:X (HCS08) or IX (HC12) */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_x(unsigned int value) {
	usb_data[0]=3;	 /* send 3 bytes */
	usb_data[1]=CMD_WRITE_REG_X;
	*((unsigned int*)(usb_data+2)) = value;
	opensourcebdm_usb_send_ep0(usb_data);
}

#if SELAHCS08
// no IY in HCS08
#else
/* writes IY (HC12 only) */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_y(unsigned int value) {
	usb_data[0]=3;	 /* send 3 bytes */
	usb_data[1]=CMD_WRITE_REG_Y;
	*((unsigned int*)(usb_data+2)) = value;
	opensourcebdm_usb_send_ep0(usb_data);
}
#endif

/* writes B:A (HC12) or A (HCS08) */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_d(unsigned int value) {
	usb_data[0]=3;	 /* send 3 bytes */
	usb_data[1]=CMD_WRITE_REG_D;
	*((unsigned int*)(usb_data+2)) = value;
	opensourcebdm_usb_send_ep0(usb_data);
}

/* writes CCR */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_ccr(unsigned int value) {
	usb_data[0]=3;	 /* send 3 bytes */
	usb_data[1]=CMD_WRITE_REG_CCR;
	*((unsigned int*)(usb_data+2)) = value;
	opensourcebdm_usb_send_ep0(usb_data);
}

#if SELAHCS08
		unsigned char WINAPI __declspec(dllexport) opensourcebdm_read_status(void) {
			usb_data[0]=2;
			usb_data[1]=CMD_READ_STATUS;
			opensourcebdm_usb_recv_ep0(usb_data);
			return(usb_data[1]);
		}

		void WINAPI __declspec(dllexport) opensourcebdm_write_control(unsigned char value) {

			usb_data[0]=2;     ///send 2 bytes
			usb_data[1]=CMD_WRITE_CONTROL;
			usb_data[2] = value;	//place full word
			print("Start WRITE CONTROL %5x\r\n", value);
			opensourcebdm_usb_send_ep0(usb_data);
			print("End WRITE CONTROL\r\n");
		}



		void WINAPI __declspec(dllexport) opensourcebdm_write_bkpt(unsigned int value) {

			usb_data[0]=3;     ///send 3 bytes
			usb_data[1]=CMD_WRITE_BKPT;
			*((unsigned int*)(usb_data+2)) = value;	//place full word
			print("Start WRITE BKPT %5x\r\n", value);
			opensourcebdm_usb_send_ep0(usb_data);
			//printdump(usb_data, 3);
			print("End WRITE BKPT\r\n");
		}

		unsigned int WINAPI __declspec(dllexport) opensourcebdm_read_bkpt(void) {
			usb_data[0]=3;		//get 3 bytes
			usb_data[1]=CMD_READ_BKPT;
			print("Start READ BKPT\r\n");
			opensourcebdm_usb_recv_ep0(usb_data);
			print("End READ BKPT  %2x  %2x  %2x \r\n",usb_data[0],usb_data[1],usb_data[2] );

			//return(usb_data[1]);
			return((*((unsigned int *)(usb_data+1))&0xffff));
		}

#endif


BOOL WINAPI __declspec(dllexport) LibMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved) {
	char path[MAX_PATH];
	char *charp;
	time_t time_now;
    switch (fdwReason) {
        case DLL_PROCESS_ATTACH:
			opensourcebdm_usb_init();			/* initialise USB */
			#ifdef LOG
				GetModuleFileName(NULL,path,sizeof(path));
				charp=strchr(path,'\\');
				if (charp!=NULL) {
					while (strchr(charp+1,'\\')) charp=strchr(charp+1,'\\');	/* find the last backslash */
					strcpy(charp+1,"OpenSourceBDM_dll.log");
					log_file=fopen(path,"wb");
				}
				print("Log file path: %s\r\n",path);
				print("Open Source BDM DLL v%1d.%1d. Compiled on %s, %s.\r\n",opensourcebdm_DLL_VERSION/16,opensourcebdm_DLL_VERSION&0x0f,__DATE__,__TIME__);
				time(&time_now);
				print("Log file created on: %s\r", ctime(&time_now));
			#endif
            break;
        case DLL_PROCESS_DETACH:
			#ifdef LOG
				time(&time_now);
				print("End of log file: %s\r", ctime(&time_now));
				fclose(log_file);
			#endif
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -