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

📄 usb.h

📁 PIC Kit serial source code.
💻 H
字号:
//==================================================================== 
//--- COPYRIGHT
//==================================================================== 
// Copyright 2006 Microchip Technology Inc.
// 
// Microchip Technology Inc. ("Microchip") licenses this software to
// you solely for use with Microchip products. The software is owned
// by Microchip and is protected under applicable copyright laws. All
// rights reserved.
// 
// SOFTWARE IS PROVIDED IN AN "AS IS." MICROCHIP EXPRESSLY DISCLAIMS ANY
// WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
// BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
// DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
// PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
// BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
// ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
// 
//==================================================================== 
//--- TITLE
//==================================================================== 
//    Filename:            usb.h
//    Microcontroller:     PIC18F2550
//    Compiled using:      C18 V3.00
//
//    Author:              Mark Enochson
//    Company:             Microchip Technology Inc.
//
//==================================================================== 
//--- DESCRIPTION
//==================================================================== 
//
//==================================================================== 
//--- HISTORY
//==================================================================== 
//
//    0001 - 08-01-06 - ME
//    - initial release
//
//==================================================================== 

#ifndef __USB_H
#define __USB_H

//------------------------------------------------
//--- USB DATA I/O DEFINES FOR CALLER
//------------------------------------------------
#define USB_RCVBUF_READY_FLAG    usb_flags_B.bit6
#define USB_RCVBUF_COUNT_REG     usb_bdt_ep1_out.count
#define USB_RCVBUF_COUNT_MAX     64
#define USB_RCVBUF_SIZE          64
#define USB_RCVBUF_POINTER       usb_buf_ep1_out
#define USB_RCVBUF_RELEASE_FUNC  usb_ep1_out_finish
#define USB_RCVBUF_GET_FUNC      usb_ep1_out_get

#define USB_XMTBUF_READY_FLAG    usb_flags_B.bit7
#define USB_XMTBUF_COUNT_REG     usb_bdt_ep1_in.count
#define USB_XMTBUF_COUNT_MAX     64
#define USB_XMTBUF_SIZE          64
#define USB_XMTBUF_POINTER       usb_buf_ep1_in
#define USB_XMTBUF_RELEASE_FUNC  usb_ep1_in_finish
#define USB_XMTBUF_PUT_FUNC      usb_ep1_in_put

//------------------------------------------------
//---
//------------------------------------------------
#define  USB_EP0_SIZE_MAX     64
#define  USB_EP1_SIZE_MAX     64

//------------------------------------------------
//--- USB H/W REGISTER: UEPx
//------------------------------------------------
#define  _EPSTALL    0x01
#define  _EPINEN     0x02
#define  _EPOUTEN    0x04
#define  _EPCONDIS   0x08
#define  _EPHSHK     0x10

//------------------------------------------------
//--- LOCAL FLAGS
//------------------------------------------------
#define  USB_ADDR_1_FLAG         usb_flags_B.bit0
#define  USB_ADDR_2_FLAG         usb_flags_B.bit1
#define  USB_READY_FLAG          usb_flags_B.bit2
#define  USB_IN_BUSY_FLAG        usb_flags_B.bit3
//#define  USB_RCVBUF_READY_FLAG   usb_flags_B.bit6
//#define  USB_XMTBUF_READY_FLAG   usb_flags_B.bit7

//------------------------------------------------
//--- USB H/W REGISTER: USTAT
//------------------------------------------------
#define  _USTAT_EP00    0x00<<3
#define  _USTAT_EP01    0x01<<3
#define  _USTAT_IN      0x01<<2
#define  _USTAT_OUT     0x00<<2

#define  _PID_SETUP     0x0D
#define  _PID_OUT       0x01
#define  _PID_IN        0x09

//------------------------------------------------
//--- USB INTERFACE: STATE
//------------------------------------------------
#define  USB_STATE_DETACHED            0
#define  USB_STATE_ATTACHED            1
#define  USB_STATE_POWERED             2
#define  USB_STATE_DEFAULT             3
#define  USB_STATE_ADDRESS_PENDING     4
#define  USB_STATE_ADDRESS             5
#define  USB_STATE_CONFIGURED          6

//------------------------------------------------
//--- BUFFER DESCRIPTOR: STATUS: MASKs
//------------------------------------------------
#define  _BDS_BSTALL    0x04     //Buffer Stall enable
#define  _BDS_DTSEN     0x08     //Data Toggle Synch enable
#define  _BDS_INCDIS    0x10     //Address increment disable
#define  _BDS_KEN       0x20     //SIE keeps buff descriptors enable
#define  _BDS_DAT0      0x00     //DATA0 packet expected next
#define  _BDS_DAT1      0x40     //DATA1 packet expected next
#define  _BDS_DTS       0x40
#define  _BDS_USIE      0x80     //SIE owns buffer
#define  _BDS_UOWN      0x80
#define  _BDS_UCPU      0x00     //CPU owns buffer

//------------------------------------------------
//--- BUFFER DESCRIPTOR: STATUS: TYPEDEF
//------------------------------------------------
typedef union _BD_STAT
{
   TD_BYTE _b;
   struct{
      unsigned bc8:1;
      unsigned bc9:1;
      unsigned bstall:1;    // Buffer Stall Enable
      unsigned dtsen:1;     // Data Toggle Synch Enable
      unsigned incdis:1;    // Address Increment Disable
      unsigned ken:1;       // BD Keep Enable
      unsigned dts:1;       // Data Toggle Synch Value
      unsigned uown:1;      // USB Ownership
   };    
   struct{
      unsigned bc8:1;
      unsigned bc9:1;
      unsigned pid0:1;      // packet ID
      unsigned pid1:1;      // packet ID
      unsigned pid2:1;      // packet ID
      unsigned pid3:1;      // packet ID
      unsigned :1;
      unsigned uown:1;      // ownership
   };
   struct{
      unsigned :2;
      unsigned pid:4;       //Packet Identifier
      unsigned :2;
   };
} TD_BD_STAT;

//------------------------------------------------
//--- BUFFER DESCRIPTOR: TYPEDEF
//------------------------------------------------
typedef union _BDT
{
   struct
   {
      TD_BD_STAT status;    // status
      TD_BYTE count;        // byte count
      TD_BYTE addr_L;       // buffer address - LSB
      TD_BYTE addr_H;       // buffer address - MSB
   };
   struct
   {
      unsigned :8;
      unsigned :8;
      TD_BYTE* addr;        // Buffer Address
   };
} BDT, TD_BDT;

//------------------------------------------------
//--- USB BUFFER: CONTROL: TYPEDEF
//------------------------------------------------
typedef union _USB_BUF_CONTROL
{
   struct
   {
      TD_BYTE   _b[USB_EP0_SIZE_MAX];
   };
   struct
   {
      TD_BYTE    _b0;
      TD_BYTE    _b1;
      TD_BYTE    _b2;
      TD_BYTE    _b3;
      TD_BYTE    _b4;
      TD_BYTE    _b5;
      TD_BYTE    _b6;
      TD_BYTE    _b7;
   };
   struct
   {
      TD_WORD    _w0;
      TD_WORD    _w1;
      TD_WORD    _w2;
      TD_WORD    _w3;
   };
   struct
   {
      TD_BYTE   rq_type;
      TD_BYTE   request;    
      TD_WORD   value_w;
      TD_WORD   index_w;
      TD_WORD   length_w;
   };
   struct
   {
      unsigned  :8;
      unsigned  :8;
      TD_WORD_W value_W;
      TD_WORD_W index_W;
      TD_WORD_W length_W;
   };
} USB_BUF_CONTROL;

//======================================
//--- USB SETUP REQUEST: MASKs
//======================================

//--- REQUEST: TYPE
#define  _RQTYPE_DIR_MASK        1<<7
#define  _RQTYPE_DIR_OUT         0<<7
#define  _RQTYPE_DIR_IN          1<<7

#define  _RQTYPE_TYPE_MASK       3<<5
#define  _RQTYPE_TYPE_STD        0<<5
#define  _RQTYPE_TYPE_CLASS      1<<5
#define  _RQTYPE_TYPE_VENDOR     2<<5

#define  _RQTYPE_RECP_MASK       0x1F
#define  _RQTYPE_RECP_DEV        0
#define  _RQTYPE_RECP_INTF       1
#define  _RQTYPE_RECP_EP         2
#define  _RQTYPE_RECP_OTHER      3

#define  _RQTYPE_TR_MASK         (_RQTYPE_TYPE_MASK | _RQTYPE_RECP_MASK)
#define  _RQTYPE_TR_STD_DEV      (_RQTYPE_TYPE_STD | _RQTYPE_RECP_DEV)
#define  _RQTYPE_TR_STD_INTF     (_RQTYPE_TYPE_STD | _RQTYPE_RECP_INTF)
#define  _RQTYPE_TR_CLASS_INTF   (_RQTYPE_TYPE_CLASS | _RQTYPE_RECP_INTF)

//--- REQUEST: (STD)
#define  _RQ_GET_STATUS          0x00
#define  _RQ_CLEAR_FEATURE       0x01
#define  _RQ_SET_FEATURE         0x03
#define  _RQ_SET_ADDRESS         0x05
#define  _RQ_GET_DESCRIPTOR      0x06
#define  _RQ_SET_DESCRIPTOR      0x07
#define  _RQ_GET_CONFIGURATION   0x08
#define  _RQ_SET_CONFIGURATION   0x09
#define  _RQ_GET_INTERFACE       0x0A
#define  _RQ_SET_INTERFACE       0x0B
#define  _RQ_SYNC_FRAME          0x0C

//--- REQUEST: (CLASS)
#define  _RQ_SET_IDLE            0x0A
#define  _RQ_GET_REPORT          0x01
#define  _RQ_SET_REPORT          0x09

//--- REQUEST: GET_DESCRIPTOR:
#define  _DESC_TYPE_DEV          0x01
#define  _DESC_TYPE_CFG          0x02
#define  _DESC_TYPE_STR          0x03
#define  _DESC_TYPE_INTF         0x04
#define  _DESC_TYPE_EP           0x05
#define  _DESC_TYPE_DEVQUAL      0x06
#define  _DESC_TYPE_OSC          0x07
#define  _DESC_TYPE_RPT          0x22


//==========================================================
//--- DATA: EXTERN
//==========================================================

//--- USB buffer descriptor(s)
extern volatile far BDT usb_bdt_ep0_out;    // endpoint: 0, dir: out
extern volatile far BDT usb_bdt_ep0_in;     // endpoint: 0, dir: in
extern volatile far BDT usb_bdt_ep1_out;    // endpoint: 1, dir: out
extern volatile far BDT usb_bdt_ep1_in;     // endpoint: 1, dir: in

//--- USB buffer(s)
extern volatile far USB_BUF_CONTROL usb_buf_ep0_out;
extern volatile far USB_BUF_CONTROL usb_buf_ep0_in;
extern volatile far TD_BYTE usb_buf_ep1_out[USB_EP1_SIZE_MAX];
extern volatile far TD_BYTE usb_buf_ep1_in[USB_EP1_SIZE_MAX];

//--- INTERFACE / MISC
extern TD_BYTE    usb_addr;
extern TD_BYTE    usb_config;
extern TD_BYTE    usb_state;
extern TD_BYTE_B  usb_flags_B;

extern TD_POINTER usb_trn_src_p;
extern TD_POINTER usb_trn_dst_p;
extern TD_BYTE usb_trn_count;


//==========================================================
//--- PROTOTYPES
//==========================================================
void usb_init(void);
void usb_bdt_load(void);
void usb_isr(void);
void usb_svc(void);

void usb_detach_soft(void);
void usb_module_disable(void);

void usb_trn(void);
void usb_trn_setup(void);
void usb_trn_setup_std_dev(void);
void usb_trn_setup_std_dev_getdsc(void);
void usb_trn_setup_std_dev_getstring(void);
void usb_trn_setup_std_intf(void);
void usb_trn_setup_std_intf_getdsc(void);
void usb_trn_setup_class_intf(void);
void usb_trn_setup_class_intf_getreport(void);

void usb_trn_control_out(void);
void usb_trn_control_in(void);

void usb_ep0_load_flash_init(void);
void usb_ep0_load_flash(void);

void usb_ep0_load_0len(void);
void usb_ep0_trn_unsupported(void);
void usb_ep0_out_finish(void);
void usb_ep0_in_finish(void);

void usb_ep1_check(void);
void usb_ep1_in_finish(void);
void usb_ep1_out_finish(void);
void usb_ep1_out_get(TD_BYTE *dst_p);
void usb_ep1_in_put(TD_BYTE *src_p);

#endif // __USB_H

⌨️ 快捷键说明

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