1 /*
2  * Copyright : (C) 2024 Phytium Information Technology, Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Modify History:
7  *  Ver   Who        Date         Changes
8  * ----- ------     --------    --------------------------------------
9  * 1.0   zhugengyu  2024/6/26 first commit
10  */
11 #include "rtthread.h"
12 #include "interrupt.h"
13 
14 #include "fparameters.h"
15 
16 #include "usbh_core.h"
17 
18 static const uint32_t irq_nums[] = {
19     FUSB2_0_VHUB_IRQ_NUM, FUSB2_1_IRQ_NUM, FUSB2_2_IRQ_NUM
20 };
21 
22 void USBH_IRQHandler(uint8_t busid);
23 
usb_assert(const char * filename,int linenum)24 void usb_assert(const char *filename, int linenum)
25 {
26     rt_assert_handler("", filename, linenum);
27 }
28 
usb_hc_pusb2_interrupt_handler(int irqno,void * param)29 static void usb_hc_pusb2_interrupt_handler(int irqno, void *param)
30 {
31     if (irqno == FUSB2_0_VHUB_IRQ_NUM) {
32         USBH_IRQHandler(FUSB2_ID_VHUB_0);
33     } else if (irqno == FUSB2_1_IRQ_NUM) {
34         USBH_IRQHandler(FUSB2_ID_1);
35     } else if (irqno == FUSB2_2_IRQ_NUM) {
36         USBH_IRQHandler(FUSB2_ID_2);
37     }
38 }
39 
usb_hc_setup_pusb2_interrupt(uint32_t id)40 static void usb_hc_setup_pusb2_interrupt(uint32_t id)
41 {
42     uint32_t irq_num = irq_nums[id];
43 
44     rt_hw_interrupt_set_priority(irq_num, 0U);
45     rt_hw_interrupt_install(irq_num, usb_hc_pusb2_interrupt_handler, NULL, "pusb2-hc");
46     rt_hw_interrupt_umask(irq_num);
47 
48     USB_LOG_DBG("Enable irq-%d\n", irq_num);
49 }
50 
usb_hc_revoke_pusb2_interrupt(uint32_t id)51 static void usb_hc_revoke_pusb2_interrupt(uint32_t id)
52 {
53     uint32_t irq_num = irq_nums[id];
54 
55     rt_hw_interrupt_mask(irq_num);
56 }
57 
usb_hc_get_register_base(uint32_t id)58 unsigned long usb_hc_get_register_base(uint32_t id)
59 {
60     if (id == FUSB2_ID_VHUB_0) {
61         return FUSB2_0_VHUB_BASE_ADDR;
62     } else if (id == FUSB2_ID_1) {
63         return FUSB2_1_BASE_ADDR;
64     } else if (id == FUSB2_ID_2) {
65         return FUSB2_2_BASE_ADDR;
66     } else {
67         USB_ASSERT(0);
68         return 0;
69     }
70 }
71 
usb_hc_low_level_init(struct usbh_bus * bus)72 void usb_hc_low_level_init(struct usbh_bus *bus)
73 {
74     usb_hc_setup_pusb2_interrupt(bus->busid);
75 }
76 
usb_hc_low_level_deinit(struct usbh_bus * bus)77 void usb_hc_low_level_deinit(struct usbh_bus *bus)
78 {
79     usb_hc_revoke_pusb2_interrupt(bus->busid);
80 }
81 
usb_sys_mem_malloc(size_t size)82 void *usb_sys_mem_malloc(size_t size)
83 {
84     void *buf = rt_malloc(size);
85 
86     if (buf) {
87         rt_memset(buf, 0, size);
88     }
89 
90     return buf;
91 }
92 
usb_sys_mem_free(void * ptr)93 void usb_sys_mem_free(void *ptr)
94 {
95     if (ptr) {
96         rt_free(ptr);
97     }
98 }
99 
usb_sys_malloc_align(size_t align,size_t size)100 void *usb_sys_malloc_align(size_t align, size_t size)
101 {
102     void *buf = rt_malloc_align(size, align);
103 
104     if (buf) {
105         rt_memset(buf, 0, size);
106     }
107 
108     return buf;
109 }