Files
CherryUSB/port/pusb2/rt-thread/usb_hc_glue_phytium.c
2024-08-09 22:43:22 +08:00

109 lines
2.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright : (C) 2024 Phytium Information Technology, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*
* Modify History:
* Ver   Who        Date         Changes
* ----- ------     --------    --------------------------------------
* 1.0 zhugengyu 2024/6/26 first commit
*/
#include "rtthread.h"
#include "interrupt.h"
#include "fparameters.h"
#include "usbh_core.h"
static const uint32_t irq_nums[] = {
FUSB2_0_VHUB_IRQ_NUM, FUSB2_1_IRQ_NUM, FUSB2_2_IRQ_NUM
};
void USBH_IRQHandler(uint8_t busid);
void usb_assert(const char *filename, int linenum)
{
rt_assert_handler("", filename, linenum);
}
static void usb_hc_pusb2_interrupt_handler(int irqno, void *param)
{
if (irqno == FUSB2_0_VHUB_IRQ_NUM) {
USBH_IRQHandler(FUSB2_ID_VHUB_0);
} else if (irqno == FUSB2_1_IRQ_NUM) {
USBH_IRQHandler(FUSB2_ID_1);
} else if (irqno == FUSB2_2_IRQ_NUM) {
USBH_IRQHandler(FUSB2_ID_2);
}
}
static void usb_hc_setup_pusb2_interrupt(uint32_t id)
{
uint32_t irq_num = irq_nums[id];
rt_hw_interrupt_set_priority(irq_num, 0U);
rt_hw_interrupt_install(irq_num, usb_hc_pusb2_interrupt_handler, NULL, "pusb2-hc");
rt_hw_interrupt_umask(irq_num);
USB_LOG_DBG("Enable irq-%d\n", irq_num);
}
static void usb_hc_revoke_pusb2_interrupt(uint32_t id)
{
uint32_t irq_num = irq_nums[id];
rt_hw_interrupt_mask(irq_num);
}
unsigned long usb_hc_get_register_base(uint32_t id)
{
if (id == FUSB2_ID_VHUB_0) {
return FUSB2_0_VHUB_BASE_ADDR;
} else if (id == FUSB2_ID_1) {
return FUSB2_1_BASE_ADDR;
} else if (id == FUSB2_ID_2) {
return FUSB2_2_BASE_ADDR;
} else {
USB_ASSERT(0);
return 0;
}
}
void usb_hc_low_level_init(struct usbh_bus *bus)
{
usb_hc_setup_pusb2_interrupt(bus->busid);
}
void usb_hc_low_level_deinit(struct usbh_bus *bus)
{
usb_hc_revoke_pusb2_interrupt(bus->busid);
}
void *usb_sys_mem_malloc(size_t size)
{
void *buf = rt_malloc(size);
if (buf) {
rt_memset(buf, 0, size);
}
return buf;
}
void usb_sys_mem_free(void *ptr)
{
if (ptr) {
rt_free(ptr);
}
}
void *usb_sys_malloc_align(size_t align, size_t size)
{
void *buf = rt_malloc_align(size, align);
if (buf) {
rt_memset(buf, 0, size);
}
return buf;
}