📄 usbop.cpp
字号:
// USBOP.cpp: implementation of the CUSBOP class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "USBISP.h"
#include "USBOP.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
usb_dev_handle *handle= NULL;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUSBOP::CUSBOP()
{
}
CUSBOP::~CUSBOP()
{
}
int CUSBOP::usbaspOpen()
{
struct usb_bus *bus;
struct usb_device *dev;
int errorCode = USB_ERROR_NOTFOUND;
static int didUsbInit = 0;
if(!didUsbInit)
{
didUsbInit = 1;
usb_init();
}
usb_find_busses();
Sleep(1);
char i=usb_find_devices();
CString a;
a.Format("%d",i);
//::AfxMessageBox(a);
for(bus=usb_get_busses(); bus; bus=bus->next)
{
for(dev=bus->devices; dev; dev=dev->next)
{
if(dev->descriptor.idVendor == USBDEV_SHARED_VENDOR && dev->descriptor.idProduct == USBDEV_SHARED_PRODUCT)
{
handle=usb_open(dev); // we need to open the device in order to query st
if(!handle)
{
errorCode = USB_ERROR_ACCESS;
fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror());
::AfxMessageBox("Could not open USB device");
continue;
}
else break;
}
}
if(handle)
break;
}
if(handle!=NULL)
{
errorCode=0;
}
return errorCode;
}
BOOL CUSBOP::usbaspClose()
{
unsigned char temp[4];
if (!handle)
return FALSE;
memset(temp, 0, sizeof(temp));
usbaspTransmit(1, USBASP_FUNC_DISCONNECT, temp, temp, sizeof(temp));
usb_close(handle);
return TRUE;
}
int CUSBOP::usbaspTransmit(unsigned char receive, unsigned char functionid,unsigned char send[4], unsigned char * buffer, int buffersize)
{
if(handle==NULL)
{
AfxMessageBox("USB句柄无效");
return 0;
}
int nbytes;
nbytes = usb_control_msg(handle,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | (receive << 7),
functionid,
(send[1] << 8) | send[0],
(send[3] << 8) | send[2],
(char *)buffer,buffersize,
5000);
if(nbytes < 0)
{
//ShowMessage("usbasp_transmit:\n");
//exit(1);
}
return nbytes;
}
BOOL CUSBOP::usbaspConnect()
{
unsigned char temp[4];
memset(temp, 0, sizeof(temp));
memset(temp, 0, sizeof(temp));
temp[0]=0x02;
temp[2]=m_ChipType.IspSck; //固件速度
temp[3]=m_ChipType.FType; //芯片类型
usbaspTransmit(1, USBASP_FUNC_CONNECT, temp, temp, sizeof(temp));
return TRUE;
}
BOOL CUSBOP::usbaspDisconnect()
{
unsigned char temp[4];
memset(temp, 0, sizeof(temp));
memset(temp, 0, sizeof(temp));
temp[0]=0x02;
usbaspTransmit(1,USBASP_FUNC_DISCONNECT, temp, temp, sizeof(temp));
return TRUE;
}
int CUSBOP::usbaspInitialize()
{
unsigned char temp[4];
memset(temp, 0, sizeof(temp));
temp[0]=0x02;
temp[2]=m_ChipType.IspSck; //固件速度
temp[3]=m_ChipType.FType; //芯片类型
usbaspTransmit(1, USBASP_FUNC_CONNECT, temp, temp, sizeof(temp));
Sleep(10);
return 0;
}
unsigned char CUSBOP::usbaspCheck() //0 连接usb设备,其他没有正常连接
{
unsigned char c=0,c1;
if (handle) c1=0; //已连接,直接返回0
else c1=1;
c=usbaspOpen(); //否则检测是否连接
if (c==0)
{
if(c1!=0)
{ //"USB设备已打开!"
usbaspInitialize();
usbaspConnect();
}
}
else if (c==1)
{
AfxMessageBox("没检到USBISP下载器!");
}
else if (c==2)
{
AfxMessageBox("打开USB设备失败!");
}
return c;
}
BOOL CUSBOP::usbaspEnable()
{
/* Do nothing. */
return TRUE;
}
BOOL CUSBOP::usbaspEnterProMode()
{
unsigned char temp[4];
memset(temp, 0, sizeof(temp));
memset(temp, 0, sizeof(temp));
temp[0]=0x02;
temp[1]=m_ChipType.FType; //芯片类型
int nbytes=usbaspTransmit(1, USBASP_FUNC_ENABLEPROG, temp, temp, sizeof(temp));
if(nbytes==0) return FALSE;
else return TRUE;
}
int CUSBOP::usbaspCmd(unsigned char cmd[4], unsigned char res[4])
{
int nbytes;
nbytes=usbaspTransmit(1, USBASP_FUNC_TRANSMIT, cmd, res, sizeof(res));
if (nbytes != 4)
{
//AfxMessageBox("wrong responds size.");
return -1;
}
return 0;
}
int CUSBOP::usbaspReceive(unsigned char *p)
{
int nbytes;
unsigned char cmd[4];
nbytes=usbaspTransmit(1,USBASP_FUNC_UART,cmd,p,200);
return nbytes;
}
int CUSBOP::usbaspSetting(unsigned char p[4])
{
int nbytes;
unsigned char res[4];
p[0]=1;
nbytes=usbaspTransmit(1,USBASP_FUNC_SETTING,p,res,4);
return nbytes;
}
BOOL CUSBOP::mcuResert()
{
if(usbaspCheck()!=0)
{ //check use connect;
return FALSE;
}
usbaspConnect();
Sleep(10);
usbaspDisconnect();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -