gpio.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. #ifndef _GPIO_H_
  2. #define _GPIO_H_
  3. //#include "..\..\includes\types.h"
  4. #define BASE_GPIO_PTR \
  5. ((HW_GPIO*)0x00f00500)
  6. #define NUM_GPIO_PORT \
  7. 5
  8. #define ADDR_GPIO_PTR \
  9. 0x00f00500
  10. //=====================================================================================
  11. // GPIO
  12. //=====================================================================================
  13. #define BK2471_GPIO_CONFIG(gpio) (*((volatile unsigned long *) (APB_GPIO_BASE+8*(gpio)) ))
  14. #define BK2471_GPIO_DATA(gpio) (*((volatile unsigned long *) (APB_GPIO_BASE+8*(gpio)+4) ))
  15. #define REG_APB5_GPIOA_CFG (*((volatile unsigned long *) (APB_GPIO_BASE + 0x00) ))
  16. #define REG_APB5_GPIOA_DATA (*((volatile unsigned long *) (APB_GPIO_BASE + 0x04) ))
  17. #define REG_APB5_GPIOB_CFG (*((volatile unsigned long *) (APB_GPIO_BASE + 0x08) ))
  18. #define REG_APB5_GPIOB_DATA (*((volatile unsigned long *) (APB_GPIO_BASE + 0x0C) ))
  19. #define REG_APB5_GPIOC_CFG (*((volatile unsigned long *) (APB_GPIO_BASE + 0x10) ))
  20. #define REG_APB5_GPIOC_DATA (*((volatile unsigned long *) (APB_GPIO_BASE + 0x14) ))
  21. #define REG_APB5_GPIOD_CFG (*((volatile unsigned long *) (APB_GPIO_BASE + 0x18) ))
  22. #define REG_APB5_GPIOD_DATA (*((volatile unsigned long *) (APB_GPIO_BASE + 0x1C) ))
  23. #define REG_APB5_GPIOE_CFG (*((volatile unsigned long *) (APB_GPIO_BASE + 0x20) ))
  24. #define REG_APB5_GPIOE_DATA (*((volatile unsigned long *) (APB_GPIO_BASE + 0x24) ))
  25. #define REG_APB5_GPIO_WUATOD_TYPE (*((volatile unsigned long *) (APB_GPIO_BASE + 0x40) ))
  26. #define REG_APB5_GPIO_WUE_TYPE (*((volatile unsigned long *) (APB_GPIO_BASE + 0x44) ))
  27. #define REG_APB5_GPIO_WUATOD_ENABLE (*((volatile unsigned long *) (APB_GPIO_BASE + 0x48) ))
  28. #define REG_APB5_GPIO_WUE_ENABLE (*((volatile unsigned long *) (APB_GPIO_BASE + 0x4C) ))
  29. #define REG_APB5_GPIO_WUATOD_STAT (*((volatile unsigned long *) (APB_GPIO_BASE + 0x50) ))
  30. #define REG_APB5_GPIO_WUE_STAT (*((volatile unsigned long *) (APB_GPIO_BASE + 0x54) ))
  31. // GPIO config[7:0] are peripheral function enable low active. 0-Peri Function enable. 1-Normal GPIO.
  32. #define BIT_GPIO_NORMAL 0
  33. #define BIT_GPIO_OUT_EN_N 8
  34. #define BIT_GPIO_PULL_UP 16
  35. #define BIT_GPIO_PULL_DOWN 24
  36. #define BIT_GPIO_OUT_BUFFER 0
  37. #define BIT_GPIO_IN_BUFFER 8
  38. #define BIT_GPIO_INPUT_EN 16
  39. #define BIT_GPIOA_WU_TYPE 0
  40. #define BIT_GPIOB_WU_TYPE 8
  41. #define BIT_GPIOC_WU_TYPE 16
  42. #define BIT_GPIOD_WU_TYPE 24
  43. #define BIT_GPIOE_WU_TYPE 0
  44. #define GPIOA 0
  45. #define GPIOB 1
  46. #define GPIOC 2
  47. #define GPIOD 3
  48. #define GPIOE 4
  49. #define GPIO0 0
  50. #define GPIO1 1
  51. #define GPIO2 2
  52. #define GPIO3 3
  53. #define GPIO4 4
  54. #pragma anon_unions
  55. typedef struct HW_GPIOU{
  56. union{
  57. uint32 REG_0x0;
  58. struct{
  59. uint32 normal:8;
  60. //0:GPIO外设第二功能,1:普通GPIO
  61. uint32 oe_n:8;
  62. //对应的GPIO的输出使能:0-作为输出,1-不是输出
  63. uint32 pu:8;
  64. //对应的GPIO的上拉使能:0-不带上拉,带上拉,1-带上拉
  65. uint32 pd:8;
  66. //对应的GPIO的下拉使能:0-不带下拉,3-带下拉
  67. };
  68. };
  69. union{
  70. uint32 REG_0x1;
  71. struct{
  72. uint32 od:8;
  73. //GPIOA[7:0]输出寄存器值
  74. uint32 id:8;
  75. //GPIOA[7:0]引脚输入值
  76. uint32 ie:8;
  77. //对应的GPIO的输入使能:0-不是输入,2-作为输入
  78. };
  79. };
  80. }HW_GPIOU;
  81. #pragma anon_unions
  82. typedef struct HW_GPIO{
  83. HW_GPIOU gpio[NUM_GPIO_PORT];
  84. uint32 rsv[6];
  85. union{
  86. uint32 REG_0xA[2];
  87. uint32 wu_type[2];
  88. struct{
  89. uint32 wu_type_0:8;
  90. uint32 wu_type_1:8;
  91. uint32 wu_type_2:8;
  92. uint32 wu_type_3:8;
  93. uint32 wu_type_4:8;
  94. uint32 wu_type_5:8;
  95. uint32 wu_type_6:8;
  96. uint32 wu_type_7:8;
  97. //GPIO唤醒类型:1-上升沿唤醒,0-下降沿唤醒。
  98. };
  99. };
  100. union{
  101. uint32 REG_0xC[2];
  102. uint32 wu_en[2];
  103. struct{
  104. uint32 wu_e_0:8;
  105. uint32 wu_e_1:8;
  106. uint32 wu_e_2:8;
  107. uint32 wu_e_3:8;
  108. uint32 wu_e_4:8;
  109. //GPIO唤醒使能:1-中断唤醒,0-不使能。
  110. uint32 wu_e_5:8;
  111. uint32 wu_e_6:8;
  112. uint32 wu_e_7:8;
  113. };
  114. };
  115. union{
  116. uint32 REG_0xE[2];
  117. uint32 wu_stat[2];
  118. struct{
  119. uint32 wu_stat_0:8;
  120. uint32 wu_stat_1:8;
  121. uint32 wu_stat_2:8;
  122. uint32 wu_stat_3:8;
  123. uint32 wu_stat_4:8;
  124. uint32 wu_stat_5:8;
  125. uint32 wu_stat_6:8;
  126. uint32 wu_stat_7:8;
  127. //GPIO中断状态位:1-中断产生,0-没有中断。写1清除中断
  128. };
  129. };
  130. }HW_GPIO;
  131. #define GPIO_BFD_BS_NORMAL 0
  132. #define GPIO_BFD_BL_NORMAL 8
  133. #define GPIO_BFD_BS_OE_N 8
  134. #define GPIO_BFD_BL_OE_N 8
  135. #define GPIO_BFD_BS_PU 16
  136. #define GPIO_BFD_BL_PU 8
  137. #define GPIO_BFD_BS_PD 24
  138. #define GPIO_BFD_BL_PD 8
  139. #define GPIO_BFD_BS_OD 0
  140. #define GPIO_BFD_BL_OD 8
  141. #define GPIO_BFD_BS_ID 8
  142. #define GPIO_BFD_BL_ID 8
  143. #define GPIO_BFD_BS_IE 16
  144. #define GPIO_BFD_BL_IE 8
  145. #define GPIO_OutputLow(pn,pl) \
  146. /*功能:指定端口指定脚位输出0*/\
  147. /*pn:端口号;pl:将要输出0的管脚列表*/\
  148. {BK2471_GPIO_DATA(pn) &= _BFD(pl,GPIO_BFD_BS_OD,GPIO_BFD_BL_OD);}
  149. #define GPIO_OutputHigh(pn,pl) \
  150. /*功能:指定端口指定脚位输出1*/\
  151. /*pn:端口号;pl:将要输出1的管脚列表*/\
  152. {BK2471_GPIO_DATA(pn) |= BFD(pl,GPIO_BFD_BS_OD,GPIO_BFD_BL_OD);}
  153. #define GPIO_OutputNeg(pn,pl) \
  154. /*功能:指定端口指定脚位输出电平翻转*/\
  155. /*pn:端口号;pl:将要操作的管脚列表*/\
  156. {BK2471_GPIO_DATA(pn) ^= BFD(pl,GPIO_BFD_BS_OD,GPIO_BFD_BL_OD);}
  157. #define GPIO_Input(pn) \
  158. /*功能:读取指定端口电平状态*/\
  159. /*pn:端口号;*/\
  160. (GET_BFD(BK2471_GPIO_DATA(pn),GPIO_BFD_BS_ID,GPIO_BFD_BL_ID))
  161. #define GPIO_SetSF(pn,sfl) \
  162. /*功能:指定端口设置成特殊功能脚*/\
  163. /*pn:端口号;sfl:将要设为特殊功能的管脚列表*/\
  164. {\
  165. BK2471_GPIO_CONFIG(pn) &= (_BFD(sfl,GPIO_BFD_BS_NORMAL,GPIO_BFD_BL_NORMAL)&\
  166. _BFD(sfl,GPIO_BFD_BS_PU,GPIO_BFD_BL_PU)&\
  167. _BFD(sfl,GPIO_BFD_BS_PD,GPIO_BFD_BL_PD));\
  168. }
  169. #define GPIO_InputSetup(pn,i,pullup,pulldw) \
  170. /*功能:对指定端口进行输入特性设定*/\
  171. /*pn:端口号;i、pu、pd:将要设为输入、使能上拉、使能下拉的管脚列表*/\
  172. {\
  173. BK2471_GPIO_CONFIG(pn) |= (BFD(i,GPIO_BFD_BS_OE_N,GPIO_BFD_BL_OE_N)|\
  174. BFD(i,GPIO_BFD_BS_NORMAL,GPIO_BFD_BL_NORMAL)|\
  175. BFD(pullup,GPIO_BFD_BS_PU,GPIO_BFD_BL_PU)|\
  176. BFD(pulldw,GPIO_BFD_BS_PD,GPIO_BFD_BL_PD));\
  177. BK2471_GPIO_DATA(pn) |= (BFD(i,GPIO_BFD_BS_IE,GPIO_BFD_BL_IE));\
  178. }
  179. #define GPIO_DiablePU(pn,pul) \
  180. {\
  181. /*功能:禁用指定端口上拉电阻特性*/\
  182. /*pn:端口号;pu:将要禁止上拉的管脚列表*/\
  183. BK2471_GPIO_CONFIG(pn) &= (_BFD(pul,GPIO_BFD_BS_PU,GPIO_BFD_BL_PU));\
  184. }
  185. #define GPIO_DiablePD(pn,pdl) \
  186. {\
  187. /*功能:禁用指定端口下拉电阻特性*/\
  188. /*pn:端口号;pd:将要禁止下拉的管脚列表*/\
  189. BK2471_GPIO_CONFIG(pn) &= (_BFD(pdl,GPIO_BFD_BS_PD,GPIO_BFD_BL_PD));\
  190. }
  191. #define GPIO_EnablePU(pn,pul) \
  192. {\
  193. /*功能:禁用指定端口上拉电阻特性*/\
  194. /*pn:端口号;pu:将要禁止上拉的管脚列表*/\
  195. BK2471_GPIO_CONFIG(pn) |= (BFD(pul,GPIO_BFD_BS_PU,GPIO_BFD_BL_PU));\
  196. }
  197. #define GPIO_EnablePD(pn,pdl) \
  198. {\
  199. /*功能:禁用指定端口下拉电阻特性*/\
  200. /*pn:端口号;pd:将要禁止下拉的管脚列表*/\
  201. BK2471_GPIO_CONFIG(pn) |= (BFD(pdl,GPIO_BFD_BS_PD,GPIO_BFD_BL_PD));\
  202. }
  203. #define GPIO_OutputSetup(pn,oe) \
  204. /*功能:对指定端口进行输出特性设定*/\
  205. /*pn:端口号;oe:将要设为输出的管脚列表*/\
  206. {\
  207. BK2471_GPIO_CONFIG(pn) |= (BFD(oe,GPIO_BFD_BS_NORMAL,GPIO_BFD_BL_NORMAL));\
  208. BK2471_GPIO_CONFIG(pn) &= (_BFD(oe,GPIO_BFD_BS_OE_N,GPIO_BFD_BL_OE_N));\
  209. BK2471_GPIO_DATA(pn) &= (_BFD(oe,GPIO_BFD_BS_IE,GPIO_BFD_BL_IE));\
  210. }
  211. #define GPIO_HiZ(pn,pl) \
  212. /*功能:将指定端口设为高阻态:不输入、不输出、无上拉、无下拉*/\
  213. /*pn:端口号;pl:将要设为HiZ的管脚列表*/\
  214. {\
  215. BK2471_GPIO_CONFIG(pn) |= (BFD(pl,GPIO_BFD_BS_NORMAL,GPIO_BFD_BL_NORMAL)|\
  216. BFD(pl,GPIO_BFD_BS_OE_N,GPIO_BFD_BL_OE_N));\
  217. BK2471_GPIO_CONFIG(pn) &= ~(BFD(pl,GPIO_BFD_BS_PU,GPIO_BFD_BL_PU)|\
  218. BFD(pl,GPIO_BFD_BS_PD,GPIO_BFD_BL_PD));\
  219. BK2471_GPIO_DATA(pn) &= (_BFD(pl,GPIO_BFD_BS_IE,GPIO_BFD_BL_IE));\
  220. }
  221. #define GPIO_InterruptSetup(pn,enl,f_el,r_el) \
  222. /*功能:对指定端口中断设定*/\
  223. /*pn:端口号;enl、r_el、f_el:将要设为能够中断、上升沿中断、下降沿中断的管脚列表*/\
  224. {\
  225. if(pn<4){\
  226. if(f_el&enl)/*BASE_GPIO_PTR->wu_type[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_TYPE)+(pn>>2)*4) |= (BFD(f_el&enl,pn*8,8));\
  227. if(r_el&enl)/*BASE_GPIO_PTR->wu_type[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_TYPE)+(pn>>2)*4) &= (_BFD(r_el&enl,pn*8,8));\
  228. /*BASE_GPIO_PTR->wu_en[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_ENABLE)+(pn>>2)*4) |= (BFD(enl,pn*8,8));\
  229. }else {\
  230. if(f_el&enl)/*BASE_GPIO_PTR->wu_type[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_TYPE)+(pn>>2)*4) |= (BFD(f_el&enl,(pn-4)*8,8));\
  231. if(r_el&enl)/*BASE_GPIO_PTR->wu_type[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_TYPE)+(pn>>2)*4) &= (_BFD(r_el&enl,(pn-4)*8,8));\
  232. /*BASE_GPIO_PTR->wu_en[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_ENABLE)+(pn>>2)*4) |= (BFD(enl,(pn-4)*8,8));\
  233. }\
  234. }
  235. #define GPIO_WakeupSetup(pn,enl,f_el,r_el) \
  236. /*功能:对指定端口进行唤醒功能设定*/\
  237. /*pn:端口号;enl、r_el、f_el:将要设为能够唤醒、上升沿唤醒、下降沿唤醒的管脚列表*/\
  238. {\
  239. GPIO_InterruptSetup(pn,enl,f_el,r_el);\
  240. }
  241. #define GPIO_InterruptEnable(pn,en) \
  242. /*功能:对指定端口中断设定*/\
  243. /*pn:端口号;en:使能*/\
  244. {\
  245. BASE_ICU_PTR->INT_FLAG|=BIT(PID_GPIO);\
  246. BASE_ICU_PTR->INT_EN|=BIT(PID_GPIO);\
  247. if((en)==0){\
  248. if(pn<4)/*BASE_GPIO_PTR->wu_en[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_ENABLE)+(pn>>2)*4) &= _BFD(0xff,pn*8,8);\
  249. else /*BASE_GPIO_PTR->wu_en[pn>>2]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_ENABLE)+(pn>>2)*4) &= _BFD(0xff,(pn-4)*8,8);\
  250. }\
  251. }
  252. #define GPIO_ClearIF(pn,enl) \
  253. /*功能:对指定端口中断设定*/\
  254. /*pn:端口号;en:使能*/\
  255. {\
  256. /*BASE_GPIO_PTR->REG_0xE[0]*/REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_STAT)) = 0xffffffff;\
  257. /*BASE_GPIO_PTR->REG_0xE[1]*/ REG32(GET_REG_ADDR(REG_APB5_GPIO_WUATOD_STAT)+4)= 0xff;\
  258. }
  259. #if 0
  260. #define GPIO_Output(pn) \
  261. /*功能:指定端口输出*/\
  262. /*pn:端口号;*/\
  263. (*(volatile uint8 *)(ADDR_GPIO_PTR+(8*pn)+5))/*BASE_GPIO_PTR->gpio[pn].od*/
  264. #define GPIO_OutputLow(pn,pl) \
  265. /*功能:指定端口指定脚位输出0*/\
  266. /*pn:端口号;pl:将要输出0的管脚列表*/\
  267. GPIO_Output(pn)&=(~(pl))
  268. #define GPIO_OutputHigh(pn,pl) \
  269. /*功能:指定端口指定脚位输出1*/\
  270. /*pn:端口号;pl:将要输出1的管脚列表*/\
  271. GPIO_Output(pn)|=((pl))
  272. #define GPIO_OutputNeg(pn,pl) \
  273. /*功能:指定端口指定脚位输出电平翻转*/\
  274. /*pn:端口号;pl:将要操作的管脚列表*/\
  275. GPIO_Output(pn)^=((pl))
  276. #define GPIO_Input(pn) \
  277. /*功能:读取指定端口电平状态*/\
  278. /*pn:端口号;*/\
  279. BASE_GPIO_PTR->gpio[pn].id
  280. #define GPIO_SetSF(pn,sfl) \
  281. /*功能:指定端口设置成特殊功能脚*/\
  282. /*pn:端口号;sfl:将要设为特殊功能的管脚列表*/\
  283. {\
  284. BASE_GPIO_PTR->gpio[pn].normal &= (~(sfl));\
  285. BASE_GPIO_PTR->gpio[pn].pu &= (~(sfl));\
  286. BASE_GPIO_PTR->gpio[pn].pd &= (~(sfl));\
  287. }
  288. #define GPIO_InputSetup(pn,i,pullup,pulldw) \
  289. /*功能:对指定端口进行输入特性设定*/\
  290. /*pn:端口号;i、pu、pd:将要设为输入、使能上拉、使能下拉的管脚列表*/\
  291. {\
  292. BASE_GPIO_PTR->gpio[pn].normal |= (i);\
  293. BASE_GPIO_PTR->gpio[pn].ie |= ((i));\
  294. BASE_GPIO_PTR->gpio[pn].oe_n |= ((i));\
  295. if(pullup){BASE_GPIO_PTR->gpio[pn].pu |= ((pullup));}\
  296. if(pulldw){BASE_GPIO_PTR->gpio[pn].pd |= ((pulldw));}\
  297. }
  298. #define GPIO_DiablePU(pn,pul) \
  299. {\
  300. /*功能:禁用指定端口上拉电阻特性*/\
  301. /*pn:端口号;pu:将要禁止上拉的管脚列表*/\
  302. if(pul){BASE_GPIO_PTR->gpio[pn].pu &= (~(pul));}\
  303. }
  304. #define GPIO_DiablePD(pn,pdl) \
  305. {\
  306. /*功能:禁用指定端口下拉电阻特性*/\
  307. /*pn:端口号;pd:将要禁止下拉的管脚列表*/\
  308. if(pdl)BASE_GPIO_PTR->gpio[pn].pd &= (~(pdl));\
  309. }
  310. #define GPIO_OutputSetup(pn,oe) \
  311. /*功能:对指定端口进行输出特性设定*/\
  312. /*pn:端口号;oe:将要设为输出的管脚列表*/\
  313. {\
  314. BASE_GPIO_PTR->gpio[pn].normal |= (oe);\
  315. BASE_GPIO_PTR->gpio[pn].ie &= (~(oe));\
  316. BASE_GPIO_PTR->gpio[pn].oe_n &= (~(oe));\
  317. }
  318. #define GPIO_OutputSetup(pn,oe) \
  319. /*功能:对指定端口进行输出特性设定*/\
  320. /*pn:端口号;oe:将要设为输出的管脚列表*/\
  321. {\
  322. BASE_GPIO_PTR->gpio[pn].REG_0x0 |= (BFD(oe,0,8));\
  323. BASE_GPIO_PTR->gpio[pn].REG_0x0 &= (_BFD(oe,8,8));\
  324. BASE_GPIO_PTR->gpio[pn].REG_0x1 &= (_BFD(oe,16,8));\
  325. }
  326. #define GPIO_WakeupSetup(pn,enl,modl,modh) \
  327. /*功能:对指定端口进行唤醒功能设定*/\
  328. /*pn:端口号;enl、modl、modh:将要设为能够唤醒、低电平唤醒、高电平唤醒的管脚列表*/\
  329. {\
  330. if(enl)BASE_GPIO_PTR->wu_en[pn] |= ((enl));\
  331. if(modh&enl)BASE_GPIO_PTR->wu_type[pn] |= ((modh));\
  332. if(modl&enl)BASE_GPIO_PTR->wu_type[pn] &= (~(modl));\
  333. }
  334. #define GPIO_InterruptSetup(pn,enl,f_el,r_el) \
  335. /*功能:对指定端口中断设定*/\
  336. /*pn:端口号;enl、r_el、f_el:将要设为能够中断、上升沿中断、下降沿中断的管脚列表*/\
  337. {\
  338. if(((f_el)&(enl)))BASE_GPIO_PTR->wu_type[pn] |= ((f_el));\
  339. if(((r_el)&(enl)))BASE_GPIO_PTR->wu_type[pn] &= (~(r_el));\
  340. if(enl)BASE_GPIO_PTR->wu_en[pn] = ((enl));\
  341. }
  342. #define GPIO_InterruptEnable(pn,en) \
  343. /*功能:对指定端口中断设定*/\
  344. /*pn:端口号;en:使能*/\
  345. {\
  346. BASE_ICU_PTR->gpio_if = 1;\
  347. BASE_ICU_PTR->gpio_int_en = en;\
  348. /*BASE_ICU_PTR->gpio_wakeup_en = en;*/\
  349. if((en)==0){\
  350. BASE_GPIO_PTR->wu_en[pn] = 0;\
  351. }\
  352. }
  353. #define GPIO_ClearIF(pn,enl) \
  354. /*功能:对指定端口中断设定*/\
  355. /*pn:端口号;en:使能*/\
  356. {\
  357. BASE_GPIO_PTR->REG_0xE[0] = 0xffffffff;\
  358. BASE_GPIO_PTR->REG_0xE[1] = 0xff;\
  359. }
  360. #endif
  361. #endif