#include "usb.h"
#include "usb_phy.h"
/* vbus, id, dpdm, these bit is set 1 to clear, so we clear these bit when operate other bits */
static unsigned int USBC_WakeUp_ClearChangeDetect(unsigned int reg_val)
{
unsigned int temp = reg_val;
temp &= ~(1 << USBC_BP_ISCR_VBUS_CHANGE_DETECT);
temp &= ~(1 << USBC_BP_ISCR_ID_CHANGE_DETECT);
temp &= ~(1 << USBC_BP_ISCR_DPDM_CHANGE_DETECT);
return temp;
}
void USBC_EnableDpDmPullUp(void)
{
// usbc_otg_t *usbc_otg = (usbc_otg_t *)hUSB;
u32 reg_val = 0;
/* vbus, id, dpdm, these bit is set 1 to clear, so we clear these bit when operate other bits */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
reg_val |= (1 << USBC_BP_ISCR_DPDM_PULLUP_EN);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
//USBC_REG_set_bit_l(USBC_BP_ISCR_DPDM_PULLUP_EN,USBC_REG_ISCR(USBC0_BASE));//Pull up dp dm
}
void USBC_EnableIdPullUp(void)
{
u32 reg_val = 0;
/* vbus, id, dpdm, these bit is set 1 to clear, so we clear these bit when operate other bits */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
reg_val |= (1 << USBC_BP_ISCR_ID_PULLUP_EN);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
}
static void USBC_ForceIdToLow(void )
{
u32 reg_val = 0;
/* first write 00, then write 10 */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_ID);
reg_val |= (0x02 << USBC_BP_ISCR_FORCE_ID);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
}
static void USBC_ForceIdToHigh(void )
{
u32 reg_val = 0;
/* first write 00, then write 10 */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
//reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_ID);
reg_val |= (0x03 << USBC_BP_ISCR_FORCE_ID);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
}
static void USBC_ForceIdDisable(void)
{
u32 reg_val = 0;
/* vbus, id, dpdm, these bit is set 1 to clear, so we clear these bit when operate other bits */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_ID);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
}
/* force id to (id_type) */
void USBC_ForceId(u32 id_type)
{
switch(id_type)
{
case USBC_ID_TYPE_HOST:
USBC_ForceIdToLow();
break;
case USBC_ID_TYPE_DEVICE:
USBC_ForceIdToHigh();
break;
default:
USBC_ForceIdDisable();
}
}
static void USBC_ForceVbusValidDisable(void )
{
u32 reg_val = 0;
/* first write 00, then write 10 */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
}
static void USBC_ForceVbusValidToLow(void )
{
u32 reg_val = 0;
/* first write 00, then write 10 */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);
reg_val |= (0x02 << USBC_BP_ISCR_FORCE_VBUS_VALID);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
}
static void USBC_ForceVbusValidToHigh(void )
{
u32 reg_val = 0;
/* first write 00, then write 11 */
reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));
//reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);
reg_val |= (0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);
reg_val = USBC_WakeUp_ClearChangeDetect(reg_val);
USBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));
}
/* force vbus valid to (id_type) */
void USBC_ForceVbusValid(u32 vbus_type)
{
switch(vbus_type)
{
case USBC_VBUS_TYPE_LOW:
USBC_ForceVbusValidToLow();
break;
case USBC_VBUS_TYPE_HIGH:
USBC_ForceVbusValidToHigh();
break;
default:
USBC_ForceVbusValidDisable();
}
return ;
}
/*
* select the bus way for data transfer
* @hUSB: handle return by USBC_open_otg, include the key data which USBC need
* @io_type: bus type, pio or dma
* @ep_type: ep type, rx or tx
* @ep_index: ep index
*
*/
void USBC_SelectBus(u32 io_type, u32 ep_type, u32 ep_index)
{
u32 reg_val = 0;
reg_val = USBC_Readb(USBC_REG_VEND0(USBC0_BASE));
if (io_type == USBC_IO_TYPE_DMA) {
if (ep_type == USBC_EP_TYPE_TX) {
reg_val |= ((ep_index - 0x01) << 1) << USBC_BP_VEND0_DRQ_SEL; //drq_sel
reg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL; //io_dma
} else {
reg_val |= ((ep_index << 1) - 0x01) << USBC_BP_VEND0_DRQ_SEL;
reg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL;
}
} else {
//reg_val &= ~(0x1 << USBC_BP_VEND0_DRQ_SEL); //clear drq_sel, select pio
reg_val &= 0x00; // clear drq_sel, select pio
}
/* in 1667 1673 and later ic, FIFO_BUS_SEL bit(bit24 of reg0x40 for host/device)
* is fixed to 1, the hw guarantee that it's ok for cpu/inner_dma/outer_dma transfer */
// reg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL; //for 1663 set 1: enable dma, set 0: enable fifo
USBC_Writeb(reg_val, USBC_REG_VEND0(USBC0_BASE));
}
u32 usb_phy_open_clock(void)
{
usbprint("open_usb_clock\n");
//USBC_REG_clear_bit_l(USBPHY_CLK_RST_BIT, USBPHY_CLK_REG);
USBC_REG_set_bit_l(USBPHY_CLK_GAT_BIT, USBPHY_CLK_REG);
USBC_REG_set_bit_l(BUS_CLK_USB_BIT,BUS_CLK_GATE0_REG);
/*
//if (sunxi_udc_io->ahb_otg && sunxi_udc_io->mod_usbphy && !sunxi_udc_io->clk_is_open)
if(!is_usb_clock_en)
{
if (clk_prepare_enable(sunxi_udc_io->ahb_otg))
{
usbprint("ERR:try to prepare_enable sunxi_udc_io->mod_usbphy failed!\n");
}
udelay(10);
if (clk_prepare_enable(sunxi_udc_io->mod_usbphy)) {
usbprint("ERR:try to prepare_enable sunxi_udc_io->mod_usbphy failed!\n");
}
udelay(10);
is_usb_clock_en = 1;
} else
{
usbprint("ERR:usb clock open err!\n");
}
// UsbPhyInit(0);
//#if defined (CONFIG_ARCH_SUN50I)
// otg and hci0 Controller Shared phy in SUN50I
// USBC_SelectPhyToDevice(sunxi_udc_io->usb_vbase);
//#endif*/
return 0;
}
u32 close_usb_clock()
{
usbprint("close_usb_clock\n");
// if (is_usb_clock_en)
// {
// is_usb_clock_en = 0;
//
// clk_disable_unprepare(sunxi_udc_io->mod_usbphy);
//
// clk_disable_unprepare(sunxi_udc_io->ahb_otg);
// udelay(10);
//
// }
// else
// {
// usbprint("ERR:usb clock open err!\n");
// }
// UsbPhyInit(0);
return 0;
}
/* close a usb misc's interrupt */
void USBC_INT_DisableUsbMiscUint(u32 mask)
{
u32 reg_val = 0;
reg_val = USBC_Readb(USBC_REG_INTUSBE(USBC0_BASE));
reg_val &= ~mask;
USBC_Writeb(reg_val, USBC_REG_INTUSBE(USBC0_BASE));
}
/* close all usb misc's interrupt */
void USBC_INT_DisableUsbMiscAll(void)
{
USBC_Writeb(0, USBC_REG_INTUSBE(USBC0_BASE));
}
/* get tx ep's interrupt flag */
static u32 USBC_INT_TxPending(void)
{
return (USBC_Readw(USBC_REG_INTTx(USBC0_BASE)));
}
/* clear tx ep's interrupt flag */
static void USBC_INT_ClearTxPending( u8 ep_index)
{
USBC_Writew((1 << ep_index), USBC_REG_INTTx(USBC0_BASE));
}
/* clear all the tx ep's interrupt flag */
static void USBC_INT_ClearTxPendingAll(void)
{
USBC_Writew(0xffff, USBC_REG_INTTx(USBC0_BASE));
}
/* get rx ep's interrupt flag */
static u32 USBC_INT_RxPending(void)
{
return (USBC_Readw(USBC_REG_INTRx(USBC0_BASE)));
}
/* clear rx ep's interrupt flag */
static void USBC_INT_ClearRxPending(u8 ep_index)
{
USBC_Writew((1 << ep_index), USBC_REG_INTRx(USBC0_BASE));
}
/* clear all the rx ep's interrupt flag */
static void USBC_INT_ClearRxPendingAll(void)
{
USBC_Writew(0xffff, USBC_REG_INTRx(USBC0_BASE));
}
/* open a tx ep's interrupt */
static void USBC_INT_EnableTxEp(u8 ep_index)
{
USBC_REG_set_bit_w(ep_index, USBC_REG_INTTxE(USBC0_BASE));
}
/* open a rx ep's interrupt */
static void USBC_INT_EnableRxEp(u8 ep_index)
{
USBC_REG_set_bit_w(ep_index, USBC_REG_INTRxE(USBC0_BASE));
}
/* close a tx ep's interrupt */
static void USBC_INT_DisableTxEp(u8 ep_index)
{
USBC_REG_clear_bit_w(ep_index, USBC_REG_INTTxE(USBC0_BASE));
}
/* close a rx ep's interrupt */
static void USBC_INT_DisableRxEp(u8 ep_index)
{
USBC_REG_clear_bit_w(ep_index, USBC_REG_INTRxE(US
没有合适的资源?快使用搜索试试~ 我知道了~
f1c100s_usb裸机.zip_F1C100s
共147个文件
h:40个
c:39个
o:24个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 9 下载量 199 浏览量
2022-07-14
00:24:19
上传
评论 4
收藏 557KB ZIP 举报
温馨提示
f1c100s的usb裸机代码,可以提供一下参考。
资源详情
资源评论
资源推荐
收起资源包目录
f1c100s_usb裸机.zip_F1C100s (147个子文件)
firmware.bin 51KB
usb_phy.c 36KB
printf.c 21KB
malloc.c 20KB
usb_hid.c 18KB
usb_cdc.c 18KB
usb_dev.c 17KB
fb-f1c100s.c 17KB
sys-dram.c 11KB
uart-16550.c 8KB
i2c-f1c100s.c 7KB
spi-f1c100s.c 7KB
key-f1c100s-lradc.c 6KB
gpio-f1c100s.c 6KB
irq-f1c100s-gpio.c 5KB
clk-f1c100s-pll.c 5KB
cmd-cpuinfo.c 5KB
ce-f1c100s-timer.c 5KB
sys-spi-flash.c 5KB
irq-f1c100s.c 4KB
wdog-f1c100s.c 4KB
pwm-f1c100s.c 4KB
cs-f1c100s-timer.c 4KB
sys-clock.c 3KB
sys-copyself.c 3KB
irq_misc.c 3KB
sast-kk131.c 3KB
cmd-mmuinfo.c 2KB
mksunxi.c 2KB
cache.c 2KB
sys-uart.c 2KB
exception.c 2KB
dma.c 2KB
main.c 2KB
sys-mmu.c 2KB
reset-f1c100s.c 1KB
cmd-bootlinux.c 1KB
mmu.c 940B
eabi.c 424B
cpu-profiler.c 401B
.cproject 4KB
firmware.elf 391KB
mksunxi.exe 130KB
usb_phy.h 27KB
usb.h 8KB
pmu.h 6KB
printf.h 4KB
reg-defe.h 4KB
atomic.h 3KB
irq_misc.h 3KB
f1c100s-irq.h 3KB
arm32.h 2KB
irqflags.h 2KB
gpio-f1c100s.h 2KB
reg-debe.h 2KB
reg-tcon.h 2KB
f1c100s-gpio.h 2KB
limits.h 2KB
framebuffer.h 2KB
reg-ccu.h 2KB
float.h 2KB
usb_dev.h 1KB
spinlock.h 1KB
barrier.h 1KB
types.h 1KB
core_types.h 1KB
f1c100s-reset.h 1KB
reg-dram.h 1KB
io.h 1KB
io.h 1KB
sizes.h 987B
sizes.h 987B
malloc.h 886B
module.h 874B
clk-f1c100s-pll.h 766B
pwm-f1c100s.h 701B
dma.h 496B
endian.h 474B
reset-f1c100s.h 450B
linkage.h 416B
setjmp.h 323B
mmu.h 307B
configs.h 103B
f1c100s.ld 4KB
Makefile 3KB
Makefile 121B
firmware.elf.map 96KB
mksunxi 9KB
malloc.o 224KB
usb_dev.o 34KB
fb-f1c100s.o 30KB
usb_phy.o 30KB
printf.o 29KB
usb_cdc.o 21KB
sys-dram.o 20KB
usb_hid.o 19KB
pwm-f1c100s.o 18KB
gpio-f1c100s.o 13KB
sys-spi-flash.o 11KB
clk-f1c100s-pll.o 10KB
共 147 条
- 1
- 2
weixin_42651887
- 粉丝: 75
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论8