1 /* 2 * Copyright (C) 2015-2021 Alibaba Group Holding Limited 3 */ 4 5 #ifndef _U_LD_H_ 6 #define _U_LD_H_ 7 8 /** 9 * hardware registers' information 10 * @addr - register's base address of hw module 11 * @length - register region's length counted from base address of the hw module 12 */ 13 typedef struct hw_reg_info { 14 unsigned long addr; 15 int length; 16 } hw_reg_info_t; 17 18 /** 19 * hardware's register information array 20 * @size - array size of hw 21 * @hw - pointer to hw_reg_info_t 22 */ 23 typedef struct hw_reg_array_info { 24 int size; 25 hw_reg_info_t *hw[]; 26 } hw_reg_array_info_t; 27 28 /** 29 * all driver entry declared with marcos in this file should be define with this prototype 30 */ 31 typedef int (*OS_DRIVER_ENTRY)(void); 32 33 /** 34 * function prototype used to get hardware module's register information 35 */ 36 typedef hw_reg_array_info_t* (*DEVICE_HW_REG_INFO)(void); 37 38 /** 39 * this is the only driver entry API, when a driver is selected, must call this API in proper place 40 * 41 * @string process identification 42 * 43 * @return 0 for success; negative error number for failure 44 */ 45 extern int u_driver_entry(char *string); 46 47 /** 48 * all driver entry declared with XXXX_DRIVER_ENTRY or XXXX_DRIVER_FULL_ENTRY will be called with specified 49 * sequence 50 * 51 * @return 0 for success; negative error no. for failure 52 */ 53 extern int _os_driver_entry(void); 54 55 /** 56 * unified driver initialization entry 57 * do register map prior to call driver's init entry in user space 58 * 59 * @param drv_name - driver's name 60 * @param drv_init_entry - pointer to driver's init entry 61 * @param get_hw_info - pointer to the function to get driver's register info 62 * @return 0 for success; negative for failure 63 * 64 */ 65 extern int _unify_driver_init(const char *drv_name, OS_DRIVER_ENTRY drv_init_entry, DEVICE_HW_REG_INFO get_hw_info); 66 67 #define TRACE_DRV_ENTRY() //printf("%s\r\n", __func__) 68 69 /* ld sections declaration */ 70 #if defined (__CC_ARM) || defined (__GNUC__) 71 #define OS_CORE_DRIVER_ATT __attribute__((used, section(".core_driver_entry"))) 72 #define OS_BUS_DRIVER_ATT __attribute__((used, section(".bus_driver_entry"))) 73 #define OS_EARLY_DRIVER_ATT __attribute__((used, section(".early_driver_entry"))) 74 #define OS_VFS_DRIVER_ATT __attribute__((used, section(".vfs_driver_entry"))) 75 #define OS_LEVEL0_DRIVER_ATT __attribute__((used, section(".level0_driver_entry"))) 76 #define OS_LEVEL1_DRIVER_ATT __attribute__((used, section(".level1_driver_entry"))) 77 #define OS_LEVEL2_DRIVER_ATT __attribute__((used, section(".level2_driver_entry"))) 78 #define OS_LEVEL3_DRIVER_ATT __attribute__((used, section(".level3_driver_entry"))) 79 #define OS_POST_DRIVER_ATT __attribute__((used, section(".post_driver_entry"))) 80 #elif defined (__ICCARM__) 81 #pragma OS_CORE_DRIVER_ATT = ".core_driver_entry" 82 #pragma OS_BUS_DRIVER_ATT = ".bus_driver_entry" 83 #pragma OS_EARLY_DRIVER_ATT = ".early_driver_entry" 84 #pragma OS_VFS_DRIVER_ATT = ".vfs_driver_entry" 85 #pragma OS_LEVEL0_DRIVER_ATT = ".level0_driver_entry" 86 #pragma OS_LEVEL1_DRIVER_ATT = ".level1_driver_entry" 87 #pragma OS_LEVEL2_DRIVER_ATT = ".level2_driver_entry" 88 #pragma OS_LEVEL3_DRIVER_ATT = ".level3_driver_entry" 89 #pragma OS_POST_DRIVER_ATT = ".post_driver_entry" 90 #endif 91 92 /** 93 * Usage: if vendor or developer want to define a new device driver 94 * you don't need to care how to call your driver initialization, 95 * just select proper marcos here and declara your driver init function 96 * by XXXX_DRIVER_ENTRY(YOUR_DRIVER_INIT_FUNCTION) or XXXX_DRIVER_FULL_ENTRY(YOUR_DRIVER_INIT_FUNCTION) 97 * 98 * basic concept of the following marcos is as follows: 99 * 1. define a new function named xxxx_##your_driver_init_function, 100 * and put this new API's entry into image's section named .xxxx_entry 101 * 2. when _os_driver_entry is called, it will read the functions pointers 102 * from .xxxx_entry image section and call them one by one 103 * 104 * */ 105 #define CORE_DRIVER_ENTRY(x) int core_drv_##x(void) { \ 106 TRACE_DRV_ENTRY(); \ 107 return x(); \ 108 } \ 109 OS_CORE_DRIVER_ATT OS_DRIVER_ENTRY core_##x = core_drv_##x; 110 111 #define BUS_DRIVER_FULL_ENTRY(init, get_hw_info) int bus_drv_##init(void) { \ 112 return _unify_driver_init(__func__, init, get_hw_info); \ 113 } \ 114 OS_BUS_DRIVER_ATT OS_DRIVER_ENTRY bus_##init = bus_drv_##init; 115 116 #define BUS_DRIVER_ENTRY(init) BUS_DRIVER_FULL_ENTRY(init, NULL) 117 118 119 #define VFS_DRIVER_FULL_ENTRY(init, get_hw_info) int vfs_drv_##init(void) { \ 120 return _unify_driver_init(__func__, init, get_hw_info); \ 121 } \ 122 OS_VFS_DRIVER_ATT OS_DRIVER_ENTRY vfs_##init = vfs_drv_##init; 123 124 #define VFS_DRIVER_ENTRY(init) VFS_DRIVER_FULL_ENTRY(init, NULL) 125 126 #define EARLY_DRIVER_FULL_ENTRY(init, get_hw_info) int early_drv_##init(void) { \ 127 return _unify_driver_init(__func__, init, get_hw_info); \ 128 } \ 129 OS_EARLY_DRIVER_ATT OS_DRIVER_ENTRY early_##init = early_drv_##init; 130 131 #define EARLY_DRIVER_ENTRY(init) EARLY_DRIVER_FULL_ENTRY(init, NULL) 132 133 #define LEVEL0_DRIVER_FULL_ENTRY(init, get_hw_info) int level0_drv_##init(void) { \ 134 return _unify_driver_init(__func__, init, get_hw_info); \ 135 } \ 136 OS_LEVEL0_DRIVER_ATT OS_DRIVER_ENTRY level0_##init = level0_drv_##init; 137 138 #define LEVEL0_DRIVER_ENTRY(init) LEVEL0_DRIVER_FULL_ENTRY(init, NULL) 139 140 #define LEVEL1_DRIVER_FULL_ENTRY(init, get_hw_info) int level1_drv_##init(void) { \ 141 return _unify_driver_init(__func__, init, get_hw_info); \ 142 } \ 143 OS_LEVEL1_DRIVER_ATT OS_DRIVER_ENTRY level1_##init = level1_drv_##init; 144 145 #define LEVEL1_DRIVER_ENTRY(init) LEVEL1_DRIVER_FULL_ENTRY(init, NULL) 146 147 148 #define LEVEL2_DRIVER_FULL_ENTRY(init, get_hw_info) int level2_drv_##init(void) { \ 149 return _unify_driver_init(__func__, init, get_hw_info); \ 150 } \ 151 OS_LEVEL2_DRIVER_ATT OS_DRIVER_ENTRY level2_##init = level2_drv_##init; 152 153 #define LEVEL2_DRIVER_ENTRY(init) LEVEL2_DRIVER_FULL_ENTRY(init, NULL) 154 155 #define LEVEL3_DRIVER_FULL_ENTRY(init, get_hw_info) int level3_drv_##init(void) { \ 156 return _unify_driver_init(__func__, init, get_hw_info); \ 157 } \ 158 OS_LEVEL3_DRIVER_ATT OS_DRIVER_ENTRY level3_##init = level3_drv_##init; 159 160 #define LEVEL3_DRIVER_ENTRY(init) LEVEL3_DRIVER_FULL_ENTRY(init, NULL) 161 162 #define POST_DRIVER_FULL_ENTRY(init, get_hw_info) int post_drv_##init(void) { \ 163 return _unify_driver_init(__func__, init, get_hw_info); \ 164 } \ 165 OS_POST_DRIVER_ATT OS_DRIVER_ENTRY post_##init = post_drv_##init; 166 167 #define POST_DRIVER_ENTRY(init) POST_DRIVER_FULL_ENTRY(init, NULL) 168 169 #endif //_U_LD_H_ 170