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

📄 usbhost.c

📁 看到最近大家都关心 usbhost 的实现, 论坛上能找到的代码仅是一些简单的 demo , 完整的源码级的协议层是找不到的 我就贡献一把, 将我前一段时间移植成功的 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 + -