📄 usbhost.c
字号:
/*****************************************************************************
* usbhost.c: USB host initialization C file for NXP LPC23xx/24xx Family
* Microprocessors
*
* Copyright(C) 2006, NXP Semiconductor
* All rights reserved.
*
* History
* 2007.07.20 ver 1.00 Prelimnary version, first Release
*
*****************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "..\hardware\LPC2468.h" /* 24xx Peripheral Registers */
#include "..\rtxOS\rtl.h"
#include "..\hardware\irq.h"
#include "..\main\sys_config.h"
#include "..\main\sys.h"
//#include "type.h"
#include "usbhost.h"
#include "usb_ohci.h"
#include "usb.h"
#include "fat.h"
extern int usbhost_reset(void);//"reset - reset (rescan) USB controller\n"
extern int usbhost_start(void);
extern int usbhost_stop(void);//"usb stop [f] - stop USB [f]=force stop\n"
extern int usbhost_tree(void);//"usb tree - show USB device tree\n"
extern int usbhost_scan(void);
//extern int usbhost_stor(void);//"usb storage - show details of USB storage devices\n"
extern int usbhost_part(void);//"usb part [dev] - print partition table of one or all USB storage devices\n"
extern int usbhost_info(int argc, char *argv[]);//"usb info [dev] - show available USB devices\n"
int usb_stor_exists(void);
//to memory address `addr'\n"
extern int usbhost_dev(int dev);//"usb dev [dev] - show or set current USB storage device\n"
unsigned int hc_interrupt_irq (void);
static int usb_stor_curr_dev; /* current device */
int usbhost_start(void)
{
usb_stop();
return usb_init();
}
int usbhost_reset(void)
{ return usbhost_start();
}
int usbhost_stop(void)
{
usb_stor_curr_dev = -1;
usb_stop(); /* "stopping USB..\n" */
return 0;
}
int usbhost_read(unsigned long rblk,unsigned long rcnt,void * rbuffer)
{
block_dev_desc_t *stor_dev;
unsigned long addr =(unsigned long)rbuffer;
unsigned long blk = rblk;
unsigned long cnt = rcnt;
unsigned long n;
if (usb_stor_curr_dev<0)
{ return 0; /* "no current device selected\n"); */
}
stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
n = stor_dev->block_read(usb_stor_curr_dev, blk, cnt, (unsigned long *)addr);
if(n == cnt)
{ return 1;
}
return 0;
}
int usbhost_write(unsigned long rblk,unsigned long rcnt,void * rbuffer)
{
block_dev_desc_t *stor_dev;
unsigned long addr =(unsigned long)rbuffer;
unsigned long blk = rblk;
unsigned long cnt = rcnt;
unsigned long n;
if (usb_stor_curr_dev<0)
{ return 0; /* "no current device selected\n"); */
}
stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
n = stor_dev->block_write(usb_stor_curr_dev, blk, cnt, (unsigned long *)addr);
if(n == cnt)
{ return 1;
}
return 0;
}
int usbhost_dev(int dev)
{block_dev_desc_t *stor_dev;
if (dev >= USB_MAX_STOR_DEV)
{ return -1;
}
stor_dev = usb_stor_get_dev(dev);
if (stor_dev->type == DEV_TYPE_UNKNOWN)
{ return -1;
}
if (stor_dev->target == 0xff)
{ return -1;
}
return dev;
}
/*****************************************************************************
** 名称: OHCIIntEnable
**
** 描述: USB host OHCI Interrupt enable
**
** 参数: None
** 返回值: None
**
*****************************************************************************/
void OHCIIntEnable(void )
{
if(!(HcInterruptEnable & OHCI_INTR_MIE))
{
HcInterruptEnable |= OHCI_INTR_MIE;
}
}
/*****************************************************************************
** 名称: OHCIIntDisable
**
** 描述: USB host OHCI Interrupt disable
**
** 参数: None
** 返回值: None
**
*****************************************************************************/
void OHCIIntDisable(void )
{
if(HcInterruptEnable & OHCI_INTR_MIE)
{
HcInterruptDisable |= OHCI_INTR_MIE;
}
}
/*****************************************************************************
** 名称: USBHostHandler
**
** 描述: USB host interrupt handler.
**
** 参数: None
** 返回值: None
**
*****************************************************************************/
_INT_USB(void)
{ OHCIIntDisable();
//HcInterruptStatus = hc_interrupt_irq();
OHCIIntEnable();
VICVectAddr = 0; /* Acknowledge Interrupt */
}
/*****************************************************************************
** 名称: USBHostInit
**
** 描述: USB host port initialization routine
** Set USB clock, GPIO pins for USB port1 and USB
** port2.
**
** 参数: None
** 返回值: true or false, if the interrupt handler
** can't be installed correctly, return false.
**
*****************************************************************************/
unsigned int USBHostInit( void)
{
/* Turn on the USB in PCONP */
PCONP |= 0x80000000;
/* Start all USB clocks */
OTG_CLK_CTRL = 0x1F;
while(OTG_CLK_STAT != 0x1F);
/* Configure port 1 as host */
OTG_STAT_CTRL = 1;
return( 1 );
}
/*****************************************************************************
** 名称: task_usb
**
** 描述: USB host 处理任务
** 参数:
** 返回值:
**
*****************************************************************************/
int usb_scan(void);
int usbhost_stor_rescan(void);
void task_usb(void) __task
{unsigned char need_rescan = 1;
unsigned char need_savetest = 1;
XIO0SET = (1<<12);
if( USBHostInit( ) == 0 ) /* usbhost 初始化 */
{ while( 1 );
}
usbhost_start(); /* usbhost 启动 */
while ( 1 )
{
if(usb_scan()) /* U 盘出现插拔重新扫描存储设备 */
{ need_rescan = 1;
}
if(need_rescan)
{ need_rescan = 0; /* 扫描存储设备 */
usb_stor_scan();
need_savetest = 1;
}
if(usb_stor_exists()) /* 检查是否存在存储设备 */
{ usb_stor_curr_dev = usbhost_dev(0); /* 选择要操作的 USB 设备 0 - usb_max_devs */
if((usb_stor_curr_dev >= 0) && (need_savetest == 1))
{ FAT_FILE *f;
char *buffer;
need_savetest = 0;
FAT_InitFiles(); /* 初始化文件系统 */
buffer = malloc(512);
if(buffer == NULL) continue;
f = FAT_fopen("test.txt", "w");
if(f != NULL)
{ sprintf(buffer, "测试文件: 时间 %4d-%2d-%2d- %2d:%2d:%2d\r\n", ctime.year, ctime.month, ctime.day, ctime.hour, ctime.min, ctime.sec);
FAT_fwrite (buffer, strlen(buffer), 1, f);
sprintf(buffer, "终端地址: %4x %5d\r\n", *(__packed unsigned short*)rtu.address.region, *(__packed unsigned short*)rtu.address.id);
FAT_fwrite (buffer, strlen(buffer), 1, f);
sprintf(buffer, "当前电压 A相: %8.1f V B相: %8.1f V C相: %8.1f V\r\n", (float)meas_r[0].u[0]/10, (float)meas_r[0].u[1]/10, (float)meas_r[0].u[2]/10);
FAT_fwrite (buffer, strlen(buffer), 1, f);
sprintf(buffer, "当前电流 A相: %8.2f A B相: %8.2f A C相: %8.2f A\r\n", (float)meas_r[0].i[0]/100, (float)meas_r[0].i[1]/100, (float)meas_r[0].i[2]/100);
FAT_fwrite (buffer, strlen(buffer), 1, f);
sprintf(buffer, "当前电能 总: %8.2f kWh 峰: %8.2f kWh 平: %8.2f kWh 谷: %8.2f kWh 尖: %8.2f kWh\r\n",
(float)meas_r[0].mmonth[0].fw_av_mrd[0]/10000, (float)meas_r[0].mmonth[0].fw_av_mrd[1]/10000, (float)meas_r[0].mmonth[0].fw_av_mrd[2]/10000,
(float)meas_r[0].mmonth[0].fw_av_mrd[3]/10000, (float)meas_r[0].mmonth[0].fw_av_mrd[4]/10000);
FAT_fwrite (buffer, strlen(buffer), 1, f);
sprintf(buffer, "上月电能 总: %8.2f kWh 峰: %8.2f kWh 平: %8.2f kWh 谷: %8.2f kWh 尖: %8.2f kWh\r\n",
(float)meas_r[0].mmonth[1].fw_av_mrd[0]/10000, (float)meas_r[0].mmonth[1].fw_av_mrd[1]/10000, (float)meas_r[0].mmonth[1].fw_av_mrd[2]/10000,
(float)meas_r[0].mmonth[1].fw_av_mrd[3]/10000, (float)meas_r[0].mmonth[1].fw_av_mrd[4]/10000);
FAT_fwrite (buffer, strlen(buffer), 1, f);
FAT_fclose(f);
}
}
}
os_dly_wait(50);
}
}
/******************************************************************************
** End Of File
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -