// usb_host_dll.h
/******************************************************************************
掕悢掕媊
******************************************************************************/
#ifdef EXPORT
#define DllExport __declspec(dllexport)
#else
#define DllExport
#endif
#define EVENT_NON 0
#define EVENT_FINISH_SEND 1
#define EVENT_DISCONNECT 0xFFFFFFFF
/******************************************************************************
EXPORT愰尵
******************************************************************************/
DllExport unsigned char* MyUsbHostInitDll(HWND hWnd,
unsigned long mssageStsNum,
HANDLE hStsEvent,
BOOL bSendBlock );
DllExport void MyUsbHostTermDll( void );
DllExport BOOL MyUsbHostSendData( unsigned char* pData, unsigned long len );
DllExport BOOL MyUsbHostRecvData( unsigned long* pLength );
DllExport unsigned long MyUsbHostGetLastEvent( void );
DllExport unsigned char* MyUsbHostGetRecvPointer( void );
DllExport unsigned long MyUsbHostGetLastError( void );
/* End of File */
/* USB僼傽儞僋僔儑儞傾僾儕働乕僔儑儞僒儞僾儖僾儘僌儔儉
//仭僼傽僀儖僿僢僟
// FileName main.c
// Version 1.00
//------------------------------------------------------------------------------
偙偺僜僼僩僂僃傾偼僼儕乕僂僃傾偱偡丅
偙偺僜僼僩僂僃傾偵娭偡傞幙栤偵偮偒傑偟偰偼丄
僒億乕僩偺懳徾奜偲側傝傑偡丅
挊嶌尃偼嶌惉尦偱偁傞(姅)杒搇揹巕偑強桳偡傞傕偺偲偟傑偡丅
偙偺僜僼僩僂僃傾傪巊梡偟偨偙偲偵傛傞慡偰偺懝奞偵偮偄偰丄
嶌惉尦偼堦愗偺愑擟傪晧傢側偄傕偺偲偟傑偡丅
偙偺僜僼僩僂僃傾偺堦晹傑偨偼慡偰傪柍抐偱揮嵹偡傞偙偲傪
嬛巭偟傑偡丅嶨帍側偳傊徯夘丒廂榐偺応崌偼楢棈傪偍婅偄抳
偟傑偡丅
Copyright (C) Hokuto denshi Co,Ltd. 2009
*/
/*******************************************************************************
丂仭僀儞僋儖乕僪僼傽僀儖
*******************************************************************************/
#include <stdio.h>
#include <machine.h>
#include "SH7216.h"
#include "usb_function_api.h"
#include "sample.h"
#define LED_ALL_OFF 0x03
#define LED_D3_ON 0x01
#define LED_D4_ON 0x02
#define LED_ALL_ON 0x00
void init ( void );
void init_port ( void );
void init_sdram ( void );
void wait( unsigned int msec );
/*******************************************************************************
丂仭void main (void)
丂庴怣僨乕僞庢摼張棟娭悢
丂------------------------------------------------------------------------------
丂@return void
丂------------------------------------------------------------------------------
丂@param in void
*******************************************************************************/
void main(void)
{
unsigned long i;
unsigned long check;
unsigned long monitor_flag;
unsigned char rcvBuff[MAXSIZE];
unsigned char sndBuff;
unsigned short led;
check = 0x00;
init(); /* 弶婜壔 */
sci_print("\nSH7216 USB奐敪僉僢僩 SAMPLE \n");
MyUsbFunctionInit(); /* USB僼傽儞僋僔儑儞弶婜壔 */
while(1)
{
while(1)
{
if(MyUsbFunctionIsConnection() != TRUE ) /* USB僨僶僀僗忬懺僠僃僢僋 */
{
if((check & 0x01) == 0x00)
{
sci_print("\n僨乕僞揮憲弨旛俶俧\n");
check = 0x01;
}
}
else
{
if((check & 0x02) == 0x00)
{
sci_print("\n僨乕僞揮憲弨旛俷俲\n");
check = 0x02;
}
break;
}
}
/* 憲怣僨乕僞 (SW3忬懺) */
if((*PBPRL & 0x0008) == 0)
{
if( monitor_flag == 1 )
{
sndBuff = 1;
MyUsbFunctionSetSendData( &sndBuff, 1 ); /* 憲怣僨乕僞愝掕 */
monitor_flag = 0;
}
}
else
{
monitor_flag = 1;
}
/* 庴怣僨乕僞 (LED忬懺) */
if( MyUsbFunctionGetRecvDataLength() != 0 ) /* 庴怣僨乕僞挿僠僃僢僋 */
{
/* 庴怣僶僢僼傽傪弶婜壔 */
for(i=0; i<MAXSIZE; i++)
{
rcvBuff[i] = '\0';
}
MyUsbFunctionGetRecvData( rcvBuff ); /* 庴怣僨乕僞庢摼 */
switch(rcvBuff[0])
{
case LED_ALL_OFF:
led = ~0x0000;
break;
case LED_D3_ON:
led = ~0x0002;
break;
case LED_D4_ON:
led = ~0x0004;
break;
case LED_ALL_ON:
led = ~0x0006;
break;
}
/* LED揰摂 */
*PEDRL = led;
}
}
}
/*******************************************************************************
丂仭void init (void)
丂弶婜壔娭悢
丂------------------------------------------------------------------------------
丂@return void
丂------------------------------------------------------------------------------
丂@param in void
*******************************************************************************/
void init( void )
{
set_imask(0);
init_port();
init_sdram();
sci_init();
}
/*******************************************************************************
丂億乕僩弶婜壔娭悢
*******************************************************************************/
void init_port( void )
{
/* 億乕僩偺擖弌椡 */
*PACRH2 = 0x0040; /* PA21 擖弌椡 PA20 擖弌椡 */
*PACRH1 = 0x0101; /* PA19 擖弌椡 PA18 擖弌椡 PA17 擖弌椡 WRL 弌椡/DQMLL 弌椡 */
*PACRL4 = 0x1227; /* WRH 弌椡/DQMLU 弌椡 RASL 弌椡 CASL 弌椡 TX_CLK 擖椡 */
*PACRL3 = 0x7777; /* PA11 擖弌椡 PA10 擖弌椡 PA9 擖弌椡 RDWR 弌椡*/
*PBCRL3 = 0x2000; /* CS3 弌椡 PB10 擖弌椡 PB9 擖弌椡 PB8 擖弌椡 */
*PBCRL1 = 0x0002; /* PB3 擖椡 PB2 擖椡 PB1 擖弌椡 RD/WR 弌椡 */
*PCCRL4 = 0x1111; /* A15 弌椡 A14 弌椡 A13 弌椡 A12 弌椡 */
*PCCRL3 = 0x1111; /* A11 弌椡 A10 弌椡 A9 弌椡 A8 弌椡 */
*PCCRL2 = 0x1111; /* A7 弌椡 A6 弌椡 A5 弌椡 A4 弌椡 */
*PCCRL1 = 0x1110; /* A3 弌椡 A2 弌椡 A1 弌椡 PC0 擖弌椡 */
*PDCRH4 = 0x7777; /* 庢傝姼偊偢擖弌椡抂巕 */
*PDCRH3 = 0x7777; /* LED愙懕偺偨傔26,27偼擖弌椡愝掕 */
*PDCRH2 = 0x7000; /* LED愙懕偺偨傔26,27偼擖弌椡愝掕 */
*PDCRL4 = 0x1111; /* D12乣D15僀僱乕僽儖 */
*PDCRL3 = 0x1111; /* D8乣D11僀僱乕僽儖 */
*PDCRL2 = 0x1111; /* D4乣D7僀僱乕僽儖 */
*PDCRL1 = 0x1111; /* D0乣D3僀僱乕僽儖 */
*PECRL4 = 0x0000;
*PECRL3 = 0x0000;
*PECRL2 = 0x0000;
*PECRL1 = 0x0000;
*PEIORL = 0x0006; /* PE_1,PE_2丂LED */
*PDIORL = 0x0000; /* PDIOL擖弌椡愝掕 */
*PBIORL = 0x0000; /* PB3:SW3 , PB10:SW2-D */
*PBPCRL = 0x0408; /* PB3,PB10丂僾儖傾僢僾 */
*PEDRL = 0x0000;
}
/*******************************************************************************
丂SDRAM弶婜愝掕娭悢
*******************************************************************************/
void init_sdram( void )
{
volatile int j = 4000;
*CS3BCR = 0x00004400; /* IWW[2:0]丄IWRWD[2:0]丄IWRWS[2:0]丄IWRRD[2:0]丄IWRRS[2:0]="B乫000"丗僒僀僋儖娫傾僀僪儖側偟 */
/* TYPE[2:0]="B乫100"丗SDRAM */
/* ENDIAN=乭0乭丗價僢僌僄儞僨傿傾儞 */
/* BSZ[1:0]="B乫10"丗16 價僢僩僨乕僞僶僗暆 */
*CS3WCR = 0x0000288a; /* WTRP[1:0]="B乫01"丗僾儕僠儍乕僕姰椆懸偪1僒僀僋儖 */
/* WTRCD[1:0]="B乫10"丗ACTV 僐儅儞僪仺READ(A)/WRIT(A)僐儅儞僪娫僂僃僀僩2僒僀僋儖 */
/* A3CL[1:0]="B乫01"丗僄儕傾3 CAS 儗僀僥儞僔 2 僒僀僋儖 */
/* TRWL[1:0]="B乫01"丗僾儕僠儍乕僕婲摦懸偪1僒僀僋儖 */
/* WTRC[1:0]="B乫10"丗REF 僐儅儞僪/僙儖僼儕僼儗僢僔儏夝彍仺ACTV/REF/MRS 僐儅儞僪娫傾僀僪儖 5 僒僀僋儖 */
*SDCR = 0x00000811; /* DEEP=乭0乭丗僨傿乕僾僷儚乕僟僂儞儌乕僪枹巊梡 */
/* SLOW=乭0乭丗掅廃攇悢儌乕僪枹巊梡 */
/* RFSH="1"丗儕僼儗僢僔儏偡傞 */
/* RMODE="0"丗僆乕僩儕僼儗僢僔儏傪峴偆 */
/* PDOWN=乭0乭丗僷儚乕僟僂儞儌乕僪枹巊梡 */
/* BACTV="0"丗僆乕僩僾儕僠儍乕僕儌乕僪 */
/* A3ROW[1:0]="B乫01"丗僄儕傾3 儘僂傾僪儗僗13 價僢僩 */
/* A3COL[1:0]="B乫01"丗僄儕傾3 僇儔儉傾僪儗僗9 價僢僩*/
*RTCOR = 0xA55A0018; /* SDRAM 偺儕僼儗僢僔儏梫媮娫妘=H乫18 */
/* 梫媮娫妘丗8192cyc/64ms = 7.8us/夞,1僒僀僋儖=1/(B兂(50MHz)/16)=320ns,7.8us亐320ns > 24=H乫18 */
*RTCSR = 0xA55A0010; /* CKS[2:0]="B乫010"丗B兂/16 僙儗僋僩 */
/* RRC[2:0]="B乫000"丗儕僼儗僢僔儏夞悢1 */
*RTCNT = 0xA55A0000;
/* ==== 200usec interval elapsed 丠 ==== */
while(j-- > 0){
/* wait */
}
*SDRAM_MODE = 0;
}
/*******************************************************************************
丂仭void wait( unsigned int msec )
丂wait娭悢
丂-----------------------------------------------------------------------------
丂@return void
丂-----------------------------------------------------------------------------
丂param in unsigned int msec
*******************************************************************************/
void wait( unsigned int msec )
{
volatile unsigned long i;
for( i=0; i<200000 * ( long )msec; i++ )
{
;
}
}
/* End of File */
sample.cpp
#define STRICT
#include <windows.h>
#include <stdio.h>
#include "resource.h"
#include "usb_host_dll.h"
// 掕悢
#define DISCONNECT 0
#define CONNECT 1
#define WM_USER_STS (WM_USER+1)
// 宆愰尵
typedef unsigned char* (*DLLFunc1)( HWND,
unsigned long,
HANDLE,
BOOL );
typedef void (*DLLFunc2)( void );
typedef BOOL (*DLLFunc3)( unsigned char *, unsigned long );
typedef BOOL (*DLLFunc4)( unsigned long* );
typedef long (*DLLFunc5)( void );
typedef unsigned char* (*DLLFunc6)( void );
// 僌儘乕僶儖
HMODULE hDll;
DLLFunc1 UsbInit;
DLLFunc2 UsbTerm;
DLLFunc3 UsbSend;
DLLFunc4 UsbRecv;
DLLFunc5 UsbGetLastEvent;
DLLFunc6 UsbGetRecvPointer;
unsigned long ConnectStatus=DISCONNECT;
HANDLE g_hMonitor;
volatile BOOL g_bExit;
// 愰尵
BOOL LoadMyUsb(void);
void InitApp(HWND hDlg);
void TermApp(HWND hDlg);
void SendApp(HWND hDlg);
void MessageApp(HWND hDlg);
void usb_connect(HWND hDlg);
void usb_disconnect(HWND hDlg);
void usb_getdata_thread( void );
//
// DialogProc - 僟僀傾儘僌儃僢僋僗 僾儘乕僔僕儍
//
LRESULT CALLBACK DlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
switch (uMessage)
{
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDCANCEL:
TermApp(hDlg);
if (hDll != NULL) // DLL儘乕僪嵪傒丠
{
FreeLibrary(hDll); // DLL偺僴儞僪儔奐曻
}
DestroyWindow(hDlg);
break;
case IDC_BUTTON1: // 幚峴
SendApp(hDlg);
break;
case IDC_BUTTON2: // 愙懕/愗抐
if(ConnectStatus == DISCONNECT)
{
InitApp(hDlg);
}
else
{
TermApp(hDlg);
}
break;
default:
return DefWindowProc(hDlg,uMessage,wParam,lParam);
}
break;
case WM_INITDIALOG:
usb_disconnect(hDlg);
break;
case WM_CLOSE:
PostMessage(hDlg,WM_COMMAND,IDCANCEL,0);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_USER_STS:
MessageApp(hDlg);
break;
default:
break;
}
return 0;
}
//
// WinMain
//
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
HWND hDlg; //儊僀儞僟僀傾儘僌僴儞僪儖
MSG msg;
WNDCLASS wndclass;
//儊僀儞僂僀儞僪僂僋儔僗偺搊榐
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = DlgProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = DLGWINDOWEXTRA;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "sampleClass";
if(RegisterClass(&wndclass) == 0)
{
//MessageBox(NULL,"僂僀儞僪僂僋儔僗傪搊榐偱偒傑偣傫偱偟偨",
// NULL, MB_APPLMODAL | MB_ICONSTOP);
MessageBox(NULL,"RegisterClass(&wndclass) error!",
NULL, MB_APPLMODAL | MB_ICONSTOP);
return FALSE;
}
if( FALSE == LoadMyUsb() )
{
return FALSE;
}
//儊僀儞僂僀儞僪僂偺惗惉
hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,(DLGPROC)DlgProc);
//儊僀儞僂僀儞僪僂偺昞帵
ShowWindow(hDlg, nCmdShow);
UpdateWindow(hDlg);
//儊僢僙乕僕儖乕僾
while(GetMessage(&msg, NULL, 0, 0))
{
if(IsDialogMessage(hDlg,&msg) == FALSE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
BOOL LoadMyUsb(void)
{
// DLL儘乕僪
hDll = LoadLibrary("MYUSBLite.dll");
if (hDll == NULL) {
//MessageBox(NULL,"MYUSBLite.dll偑尒偮偐傝傑偣傫偱偟偨偺偱丄廔椆偟傑偡丅", MB_OK, 0);
MessageBox(NULL,"LoadLibrary MYUSBLite.dll error!", MB_OK, 0);
return FALSE;
}
// 弶婜壔娭悢億僀儞僞庢摼
UsbInit = (DLLFunc1)GetProcAddress(hDll, "MyUsbHostInitDll"); //娭悢柤偱偺巜掕
if(!UsbInit){
//MessageBox(NULL,"弶婜壔娭悢億僀儞僞庢摼偑偱偒傑偣傫偺偱丄廔椆偟傑偡丅", NULL, MB_OK);
MessageBox(NULL,"GetProcAddress MyUsbHostInitDll error!", NULL, MB_OK);
return FALSE;
}
// 廔椆娭悢億僀儞僞庢摼
UsbTerm = (DLLFunc2)GetProcAddress(hDll, "MyUsbHostTermDll"); //娭悢柤偱偺巜掕
if(!UsbTerm){
//MessageBox(NULL,"廔椆娭悢億僀儞僞庢摼偑偱偒傑偣傫偺偱丄廔椆偟傑偡丅", NULL, MB_OK);
MessageBox(NULL,"GetProcAddress MyUsbHostTermDll error!", NULL, MB_OK);
return FALSE;
}
// 僨乕僞憲怣娭悢億僀儞僞庢摼
UsbSend = (DLLFunc3)GetProcAddress(hDll, "MyUsbHostSendData"); //娭悢柤偱偺巜掕
if(!UsbSend){
//MessageBox(NULL,"僨乕僞憲怣娭悢億僀儞僞庢摼偑偱偒傑偣傫偺偱丄廔椆偟傑偡丅", NULL, MB_OK);
MessageBox(NULL,"GetProcAddress MyUsbHostSendData error!", NULL, MB_OK);
return FALSE;
}
// 僨乕僞庴怣娭悢億僀儞僞庢摼
UsbRecv = (DLLFunc4)GetProcAddress(hDll, "MyUsbHostRecvData"); //娭悢柤偱偺巜掕
if(!UsbRecv){
//MessageBox(NULL,"僨乕僞庴怣娭悢億僀儞僞庢摼偑偱偒傑偣傫偺偱丄廔椆偟傑偡丅", NULL, MB_OK);
MessageBox(NULL,"GetProcAddress MyUsbHostRecvData error!", NULL, MB_OK);
return FALSE;
}
// 僨乕僞庴怣忬懺娭悢億僀儞僞庢摼
UsbGetLastEvent = (DLLFunc5)GetProcAddress(hDll, "MyUsbHostGetLastEvent"); //娭悢柤偱偺巜掕
if(!UsbGetLastEvent){
//MessageBox(NULL,"僨乕僞庴怣忬懺娭悢億僀儞僞偑庢摼偑偱偒傑偣傫偱偟偨偺偱丄廔椆偟傑偡丅", NULL, MB_OK);
MessageBox(NULL,"GetProcAddress MyUsbHostGetLastEvent error!", NULL, MB_OK);
return FALSE;
}
// 庴怣僨乕僞億僀儞僞庢摼娭悢億僀儞僞庢摼
UsbGetRecvPointer = (DLLFunc6)GetProcAddress(hDll, "MyUsbHostGetRecvPointer"); //娭悢柤偱偺巜掕
if(!UsbGetRecvPointer){
//MessageBox(NULL,"庴怣僨乕僞億僀儞僞庢摼娭悢億僀儞僞偑庢摼偑偱偒傑偣傫偱偟偨偺偱丄廔椆偟傑偡丅", NULL, MB_OK);
MessageBox(NULL,"GetProcAddress MyUsbHostGetRecvPointer error!", NULL, MB_OK);
return FALSE;
}
return TRUE;
}
void InitApp(HWND hDlg)
{
unsigned long threadID ;
if(NULL != UsbInit(hDlg, WM_USER_STS, NULL, TRUE))
{
g_bExit = FALSE;
g_hMonitor = CreateThread( 0, 0,
(LPTHREAD_START_ROUTINE)usb_getdata_thread,
0, 0, &threadID ) ;
if( g_hMonitor == NULL )
{
g_bExit = FALSE;
}
usb_connect(hDlg);
}
else
{
usb_disconnect(hDlg);
}
}
void TermApp(HWND hDlg)
{
if( g_hMonitor )
{
g_bExit = TRUE ;
while( WaitForSingleObject(g_hMonitor, 0) == WAIT_TIMEOUT)
{
Sleep( 1 ) ;
}
g_hMonitor = NULL;
}
if(NULL != UsbGetRecvPointer()) // 僆乕僾儞嵪傒丠
{
UsbTerm(); // 廔椆
}
usb_disconnect(hDlg);
}
void SendApp(HWND hDlg)
{
unsigned char sendData;
if( ConnectStatus == DISCONNECT )
{
return;
}
HWND hRadio1 = GetDlgItem( hDlg, IDC_RADIO1 ); // 慡揰摂
HWND hRadio2 = GetDlgItem( hDlg, IDC_RADIO2 ); // D3揰摂
HWND hRadio3 = GetDlgItem( hDlg, IDC_RADIO3 ); // D4揰摂
HWND hRadio4 = GetDlgItem( hDlg, IDC_RADIO4 ); // 慡徚摂
if( BST_CHECKED == (int)SendMessage( hRadio1, BM_GETCHECK, 0, 0 )) sendData = 3;
else if( BST_CHECKED == (int)SendMessage( hRadio2, BM_GETCHECK, 0, 0 )) sendData = 1;
else if( BST_CHECKED == (int)SendMessage( hRadio3, BM_GETCHECK, 0, 0 )) sendData = 2;
else if( BST_CHECKED == (int)SendMessage( hRadio4, BM_GETCHECK, 0, 0 )) sendData = 0;
else sendData = 0;
UsbSend(&sendData, 1);
}
void MessageApp(HWND hDlg)
{
unsigned long event;
if( ConnectStatus == DISCONNECT )
{
return;
}
event = UsbGetLastEvent();
switch(event)
{
case EVENT_NON:
break;
case EVENT_FINISH_SEND:
break;
case EVENT_DISCONNECT:
TermApp(hDlg);
break;
default:
break;
}
}
void usb_connect(HWND hDlg)
{
ConnectStatus = CONNECT;
//SetDlgItemText(hDlg, IDC_BUTTON2,"愗抐");
SetDlgItemText(hDlg, IDC_BUTTON2,"now connected(click me to disconnect)");
}
void usb_disconnect(HWND hDlg)
{
ConnectStatus = DISCONNECT;
//SetDlgItemText(hDlg, IDC_BUTTON2,"愙懕");
SetDlgItemText(hDlg, IDC_BUTTON2,"now disconnected(click me to connect)");
}
void usb_getdata_thread( void )
{
unsigned char* recvBuff;
unsigned long len;
BOOL ret;
while( g_bExit != TRUE )
{
ret = UsbRecv(&len);
if( ret != false )
{
if(len != 0)
{
recvBuff = UsbGetRecvPointer();
if(recvBuff[0] == 1)
{
//MessageBox(NULL, "SW3偑墴偍偝傟傑偟偨丅", "Message", MB_OK);
MessageBox(NULL, "SW3-usb_getdata_thread-recvBuff[0] = 1", "Message", MB_OK);
}
}
}
Sleep( 1 ) ; // 1ms偱娔帇
}
}