#include <usb_isr.h>
#include <2440addr.h>
#include <2440lib.h>
#include <ch9.h>
#include <usb.h>
#ifdef USBD_HID
#include <HID/usb_desc_hid.h>
#include <HID/usb_hid.h>
#endif
#ifdef USBD_MASS
#include <mass/usb_desc_mass.h>
#include <mass/usb_mass.h>
#endif
#include <uart.h>
#include <logd.h>
void hexdump(char *buff,int size)
{
int i;
if(size < 0 || buff == NULL)
return;
//LOGD("addr:%p,size:%d\n",buff,size);
for(i=0;i<size;i++)
{
if(i%10==0 && i != 0)
{
printk("\n");
}
printk("%02x\t",buff[i]);
}
printk("\n");
}
inline unsigned int ep_rx_fifo(int ep,char * buff,int buf_size)
{
int size = rOUT_FIFO_CNT1_REG | (rOUT_FIFO_CNT2_REG<<8);
int i;
volatile unsigned char * addr;
if(size > buf_size)
return -1;
switch(ep)
{
case EP0:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001c3;
#else
addr = (unsigned char *)0x520001c0;
#endif
break;
case EP1:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001c7;
#else
addr = (unsigned char *)0x520001c4;
#endif
break;
case EP2:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001cb;
#else
addr = (unsigned char *)0x520001c8;
#endif
break;
case EP3:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001cf;
#else
addr = (unsigned char *)0x520001cc;
#endif
break;
}
for(i=0;i<size;i++)
{
buff[i] = *addr;
}
return size;
}
inline void ep_tx_fifo(int ep,char * buff,unsigned int size)
{
unsigned int i;
volatile unsigned char * addr;
switch(ep)
{
case EP0:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001c3;
#else
addr = (unsigned char *)0x520001c0;
#endif
break;
case EP1:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001c7;
#else
addr = (unsigned char *)0x520001c4;
#endif
break;
case EP2:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001cb;
#else
addr = (unsigned char *)0x520001c8;
#endif
break;
case EP3:
#ifdef __BIG_ENDIAN
addr = (unsigned char *)0x520001cf;
#else
addr = (unsigned char *)0x520001cc;
#endif
break;
}
for(i=0;i<size;i++)
{
*addr = buff[i];
}
}
#define LOCK 1
#define UNLOCK 0
struct tx_req_struct
{
char *curbuf; //point to the current operation buffer
unsigned int alllen; //request length
unsigned int index; //index
int mutex;
int autoload;
int ep;
};
//a ring buff need to send data
#define RING_BUFFER_SIZE 1036
#define RING_BUFFER_SIZE_SIZE 2
#define RING_BUFFER_GUARD 10
struct ring
{
int wrptr;
int rdptr;
struct tx_req_struct cur_tx;
char buf[RING_BUFFER_SIZE];
};
struct ring g_ring[MAX_EP_NUM]={{0,0,{0},{0}}};
inline void check_boundary_high(struct ring * cur_ring)
{
if(cur_ring->wrptr == RING_BUFFER_SIZE)
{
cur_ring->wrptr = 0;
}
if(cur_ring->rdptr == RING_BUFFER_SIZE)
{
cur_ring->rdptr = 0;
}
}
inline void check_boundary_low(struct ring * cur_ring)
{
if(cur_ring->rdptr < 0)
{
cur_ring->rdptr = RING_BUFFER_SIZE -1;
}
}
int ring_autoload(struct ring * cur_ring);
void ring_tx_data(int ep)
{
struct ring * cur_ring = &g_ring[ep];
unsigned short size,max_size;
unsigned short i;
switch(ep)
{
case EP0:
max_size = g_usb_dev_desc.bMaxPacketSize0;
break;
case EP1:
//LOGD("ep1\n");
max_size = g_config_all.g_endpoint_desc.wMaxPacketSize;
break;
case EP2:
#ifdef USBD_MASS
//LOGD("ep2\n");
max_size = g_config_all.g_endpoint_desc1.wMaxPacketSize;
#endif
break;
//case EP3:
// max_size = g_config_all.g_endpoint_desc2.wMaxPacketSize;
// break;
}
if(cur_ring->wrptr !=cur_ring->rdptr)
{
size = cur_ring->buf[cur_ring->rdptr];
cur_ring->rdptr++;
check_boundary_high(cur_ring);
size |= cur_ring->buf[cur_ring->rdptr] << 8;
cur_ring->rdptr++;
check_boundary_high(cur_ring);
//printk("ep:%d,tx:%d\n",rINDEX_REG,size);
for(i=0;i<(size > max_size?max_size:size);i++)
{
ep_tx_fifo(ep,&cur_ring->buf[cur_ring->rdptr],1);
cur_ring->rdptr++;
check_boundary_high(cur_ring);
}
size -= size > max_size?max_size:size;
switch(ep)
{
case EP0:
if(size == 0)
{
if(ring_autoload(cur_ring) == -2)
{rEP0_CSR = ((rEP0_CSR & (~EP0_WR_BITS)) | IN_PKT_RDY | DATA_END);/*if(!is_ring_empty(EP2)){SET_INDEX(EP2); ring_tx_data(EP2);}*/return;}
else
{rEP0_CSR = (rEP0_CSR | IN_PKT_RDY);}
}
else
{
rEP0_CSR = rEP0_CSR | IN_PKT_RDY;
}
break;
case EP1:
case EP2:
if(size == 0)
{ring_autoload(cur_ring);rIN_CSR1_REG = CSR1_IN_PKT_RDY;return;}
else
{rIN_CSR1_REG = CSR1_IN_PKT_RDY;}
//LOGD("send\n");
break;
}
cur_ring->rdptr--;
check_boundary_low(cur_ring);
cur_ring->buf[cur_ring->rdptr] = (size & 0xff00) >> 8;
cur_ring->rdptr--;
check_boundary_low(cur_ring);
cur_ring->buf[cur_ring->rdptr] = size & 0xff;
}
}
void reset_cur_ring(struct ring * cur_ring)
{
cur_ring->rdptr = 0;
cur_ring->wrptr = 0;
cur_ring->cur_tx.mutex = UNLOCK;
cur_ring->cur_tx.alllen= 0;
cur_ring->cur_tx.index = 0;
cur_ring->cur_tx.curbuf= NULL;
}
int ring_autoload(struct ring * cur_ring)
{
int size;
unsigned int i;
if(cur_ring->cur_tx.alllen > (RING_BUFFER_SIZE - RING_BUFFER_SIZE_SIZE - RING_BUFFER_GUARD))
{
//printk("more than:ep:%d,%d\n",cur_ring->cur_tx.ep,cur_ring->cur_tx.alllen);
if(!cur_ring->cur_tx.autoload)
{LOGD("sorry\n");reset_cur_ring(cur_ring);return -1;}
cur_ring->cur_tx.alllen -= (RING_BUFFER_SIZE - RING_BUFFER_SIZE_SIZE - RING_BUFFER_GUARD);
size = RING_BUFFER_SIZE - RING_BUFFER_SIZE_SIZE - RING_BUFFER_GUARD;
}
else if(cur_ring->cur_tx.alllen == 0)
{
//printk("send over:ep:%d,%d\n",cur_ring->cur_tx.ep,cur_ring->cur_tx.alllen);
reset_cur_ring(cur_ring);
return -2;
}
else if(cur_ring->cur_tx.alllen > 0)
{
//printk("send all:ep:%d,%d\n",cur_ring->cur_tx.ep,cur_ring->cur_tx.alllen);
size = cur_ring->cur_tx.alllen;
cur_ring->cur_tx.alllen = 0;
}
//printk("ep:%d\n",cur_ring->cur_tx.ep);
cur_ring->buf[cur_ring->wrptr] = size & 0xff;
cur_ring->wrptr++;
check_boundary_high(cur_ring);
cur_ring->buf[cur_ring->wrptr] = ((size & 0xff00) >> 8);
cur_ring->wrptr++;
check_boundary_high(cur_ring);
for(i=0;i<size;i++)
{
cur_ring->buf[cur_ring->wrptr] = cur_ring->cur_tx.curbuf[cur_ring->cur_tx.index + i];
cur_ring->wrptr++;
check_boundary_high(cur_ring);
}
cur_ring->cur_tx.index += size;
return 0;
}
/*
function:ring_insert_data
ep:endpoint nubmer
buff:the buffer
size:size to be send
autoload:if support autoload
*/
void ring_insert_data(int ep,char * buff,unsigned int size,int autoload)
{
struct ring * cur_ring = &g_ring[ep];
while(cur_ring->cur_tx.mutex == LOCK)
{printk("error:request locked and tx busy:%d\n",cur_ring->cur_tx.alllen);return;}
//*******************************************
cur_ring->cur_tx.alllen = size;
cur_ring->cur_tx.curbuf = buff;
cur_ring->cur_tx.index = 0;
cur_ring->cur_tx.mutex = LOCK;
cur_ring->cur_tx.autoload = autoload;
cur_ring->cur_tx.ep = ep;
//*******************************************
ring_autoload(cur_ring);
if(ep == EP0) FLUSH_EP0_FIFO();
ring_tx_data(ep);
}
void ring_reset()
{
int i;
for(i = 0;i<MAX_EP_NUM;i++)
{
g_ring[i].rdptr = 0;
g_ring[i].wrptr = 0;
g_ring[i].cur_tx.mutex = UNLOCK;
g_ring[i].cur_tx.alllen= 0;
g_ring[i].cur_tx.index = 0;
g_ring[i].cur_tx.curbuf= NULL;
}
}
int is_ring_empty(int ep)
{
struct ring * cur_ring = &g_ring[ep];
if(cur_ring->cur_tx.alllen == 0 && cur_ring->rdptr == cur_ring->wrptr)
return 1;
return 0;
}
/******************
没有合适的资源?快使用搜索试试~ 我知道了~
亲身实践s3c2440 gcc版本的USB HID和U盘裸奔代码
4星 · 超过85%的资源 需积分: 50 38 下载量 201 浏览量
2013-12-05
19:56:24
上传
评论
收藏 91KB GZ 举报
温馨提示
共95个文件
o:34个
h:20个
c:15个
完全抛弃IDE,基于arm的gcc版本设计的USB设备。实现了HID鼠标和U盘的功能。 有问题联系我:woodsboy.cn@163.com
资源推荐
资源详情
资源评论
收起资源包目录
usbd.tar.gz (95个子文件)
usbd
rule.mk 91B
usbd.bin 19KB
copy.pl 1KB
inc
config.h 1KB
2440lib.h 970B
HID
usb_hid.h 240B
usb_desc_hid.h 366B
printf.h 71B
2440addr.h 39KB
logd.h 140B
common.h 255B
usb_isr.h 192B
uart.h 266B
interrupts.h 560B
mass
usb_desc_mass.h 335B
usbramdisk.h 292B
usb_mass.h 1KB
vsprintf.h 138B
ch9.h 25KB
main.h 69B
usb.h 2KB
usb_interface.h 157B
obj
14_start.o 3KB
2_interrupts.o 3KB
16_vsprintf.o 6KB
3_2440lib.o 1KB
13_lowlevel_init.o 864B
1_logd.o 1KB
12_usb.o 2KB
6_usb_hid.o 551B
11_usb_isr.o 11KB
15_nand.o 2KB
10_usb_mass.o 5KB
17_main.o 984B
7_usb_interface.o 804B
4_uart.o 2KB
5_usb_desc_hid.o 556B
9_usb_desc_mass.o 861B
8_usbramdisk.o 1KB
bootstrap.elf 61KB
link.lds 2KB
src
main.c 533B
lib.a 44KB
boot
lowlevel_init.S 5KB
lowlevel_init.o 864B
.sdepend 124B
start.S 8KB
makefile 331B
nand.h 539B
nand.o 2KB
.cdepend 61B
nand.c 1KB
start.o 3KB
usb
usb.c 1KB
HID
usb_desc_hid.c 4KB
usb_hid.c 3KB
usb_hid.o 551B
makefile 341B
.cdepend 535B
usb_desc_hid.o 556B
usb_isr.o 11KB
usb_isr.c 14KB
usb_if
usb_interface.o 804B
usb_interface.c 235B
makefile 268B
.cdepend 282B
makefile 356B
mass_storage
usbramdisk.o 1KB
usb_mass.o 5KB
usb_mass.c 7KB
makefile 356B
usb_desc_mass.c 2KB
usb_desc_mass.o 861B
usbramdisk.c 692B
.cdepend 1KB
usb.o 2KB
.cdepend 813B
system
interrupts.c 5KB
logd.c 938B
interrupts.o 3KB
2440lib.o 1KB
uart.o 2KB
logd.o 1KB
makefile 353B
uart.c 1KB
.cdepend 971B
2440lib.c 12KB
makefile 420B
lib
makefile 216B
vsprintf.c 5KB
.cdepend 23B
vsprintf.o 6KB
main.o 984B
.depend 331B
makefile 575B
共 95 条
- 1
资源评论
- yiyi_123_2016-05-13还可以吧。。。
- AresDing2017-08-11代码下载下来了,粗看了一下,很有味道,尊重裸跑的代码。。。要是作者能够写一份说明文档,那就更好了。
乐天游
- 粉丝: 12
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功