wiringCPi.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. #include "wiringPi.h"
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <fcntl.h>
  7. #include "wiringCPi.h"
  8. #include <stdarg.h>
  9. #include <stdlib.h>
  10. #include <ctype.h>
  11. #include <poll.h>
  12. #include <errno.h>
  13. #include <time.h>
  14. #include <pthread.h>
  15. #include <sys/time.h>
  16. #include <sys/mman.h>
  17. #include <sys/stat.h>
  18. #include <sys/wait.h>
  19. #include <sys/ioctl.h>
  20. #include <limits.h>
  21. #include "softPwm.h"
  22. #include "softTone.h"
  23. static int wpimode = -1 ;
  24. #define WPI_MODE_BCM 0
  25. #define WPI_MODE_RAW 1
  26. #define BLOCK_SIZE (4*1024)
  27. #ifdef CONFIG_CLOCKWORKPI_A04
  28. int CPI_PIN_MASK[12][32] = //[BANK] [INDEX]
  29. {
  30. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PA
  31. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PB
  32. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PC
  33. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,16,-1,18,-1,-1,21,22,23,24,25,26,-1,-1,-1,-1,-1,},//PD
  34. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PE
  35. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PF
  36. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PG
  37. {-1,-1,-1, 3, 4, 5, 6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PH
  38. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PI
  39. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PJ
  40. {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PK
  41. {-1,-1, 2, 3,-1,-1,-1,-1, 8,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PL
  42. };
  43. #endif
  44. #ifdef CONFIG_CLOCKWORKPI_A06
  45. int bcmToGpioCPi[64] =
  46. {
  47. 106, 107, // 0, 1
  48. 104, 10, // 2, 3
  49. 3, 9, // 4 5
  50. 4, 90, // 6, 7
  51. 92, 158, // 8, 9
  52. 156, 105, //10,11
  53. 146, 150, //12,13
  54. 81, 80, //14,15
  55. 82, 83, //16,17
  56. 131, 132, //18,19
  57. 134, 135, //20,21
  58. 89, 88, //22,23
  59. 84, 85, //24,25
  60. 86, 87, //26,27
  61. 112, 113, //28,29
  62. 109, 157, //30,31
  63. 148, 147, //32,33
  64. 100, 101, //34,35
  65. 102, 103, //36,37
  66. 97, 98, //38,39
  67. 99, 96, //40,41
  68. 110, 111, //42,43
  69. 64, 65, //44,45
  70. -1, -1, //46,47
  71. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63
  72. };
  73. int CPI_PIN_MASK[5][32] = //[BANK] [INDEX]
  74. {
  75. { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PA
  76. { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PB
  77. { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PC
  78. { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PD
  79. { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PD
  80. };
  81. volatile uint32_t *cru_base;
  82. volatile uint32_t *grf_base;
  83. volatile uint32_t *pmugrf_base;
  84. volatile uint32_t *pmucru_base;
  85. volatile uint32_t *gpio0_base;
  86. volatile uint32_t *gpio1_base;
  87. volatile uint32_t *gpio2_base;
  88. volatile uint32_t *gpio3_base;
  89. volatile uint32_t *gpio4_base;
  90. #endif
  91. static unsigned int readR(unsigned int addr)
  92. {
  93. #ifdef CONFIG_CLOCKWORKPI_A06
  94. unsigned int val = 0;
  95. unsigned int mmap_base = (addr & ~MAP_MASK);
  96. unsigned int mmap_seek = (addr - mmap_base);
  97. if(mmap_base == CRU_BASE)
  98. val = *((unsigned int *)((unsigned char *)cru_base + mmap_seek));
  99. else if(mmap_base == GRF_BASE)
  100. val = *((unsigned int *)((unsigned char *)grf_base + mmap_seek));
  101. else if(mmap_base == PMUCRU_BASE)
  102. val = *((unsigned int *)((unsigned char *)pmucru_base + mmap_seek));
  103. else if(mmap_base == PMUGRF_BASE)
  104. val = *((unsigned int *)((unsigned char *)pmugrf_base + mmap_seek));
  105. else if(mmap_base == GPIO0_BASE)
  106. val = *((unsigned int *)((unsigned char *)gpio0_base + mmap_seek));
  107. else if(mmap_base == GPIO1_BASE)
  108. val = *((unsigned int *)((unsigned char *)gpio1_base + mmap_seek));
  109. else if(mmap_base == GPIO2_BASE)
  110. val = *((unsigned int *)((unsigned char *)gpio2_base + mmap_seek));
  111. else if(mmap_base == GPIO3_BASE)
  112. val = *((unsigned int *)((unsigned char *)gpio3_base + mmap_seek));
  113. else if(mmap_base == GPIO4_BASE)
  114. val = *((unsigned int *)((unsigned char *)gpio4_base + mmap_seek));
  115. return val;
  116. #elif (defined CONFIG_CLOCKWORKPI_A04)
  117. uint32_t val = 0;
  118. return val;
  119. #endif
  120. }
  121. static void writeR(unsigned int val, unsigned int addr)
  122. {
  123. #ifdef CONFIG_CLOCKWORKPI_A06
  124. unsigned int mmap_base = (addr & ~MAP_MASK);
  125. unsigned int mmap_seek = (addr - mmap_base);
  126. if(mmap_base == CRU_BASE)
  127. *((unsigned int *)((unsigned char *)cru_base + mmap_seek)) = val;
  128. else if(mmap_base == GRF_BASE)
  129. *((unsigned int *)((unsigned char *)grf_base + mmap_seek)) = val;
  130. else if(mmap_base == PMUCRU_BASE)
  131. *((unsigned int *)((unsigned char *)pmucru_base + mmap_seek)) = val;
  132. else if(mmap_base == PMUGRF_BASE)
  133. *((unsigned int *)((unsigned char *)pmugrf_base + mmap_seek)) = val;
  134. else if(mmap_base == GPIO0_BASE)
  135. *((unsigned int *)((unsigned char *)gpio0_base + mmap_seek)) = val;
  136. else if(mmap_base == GPIO1_BASE)
  137. *((unsigned int *)((unsigned char *)gpio1_base + mmap_seek)) = val;
  138. else if(mmap_base == GPIO2_BASE)
  139. *((unsigned int *)((unsigned char *)gpio2_base + mmap_seek)) = val;
  140. else if(mmap_base == GPIO3_BASE)
  141. *((unsigned int *)((unsigned char *)gpio3_base + mmap_seek)) = val;
  142. else if(mmap_base == GPIO4_BASE)
  143. *((unsigned int *)((unsigned char *)gpio4_base + mmap_seek)) = val;
  144. #elif (defined CONFIG_CLOCKWORKPI_A04)
  145. #endif
  146. }
  147. int CPi_get_gpio_mode(int pin)
  148. {
  149. unsigned int regval = 0;
  150. unsigned int bank = pin >> 5;
  151. unsigned int index = pin - (bank << 5);
  152. unsigned int phyaddr = 0;
  153. unsigned char mode = -1;
  154. #ifdef CONFIG_CLOCKWORKPI_A06
  155. unsigned int grf_phyaddr = 0, ddr_phyaddr = 0;
  156. int offset = ((index - ((index >> 3) << 3)));
  157. if(bank == 0){
  158. grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2);
  159. ddr_phyaddr = GPIO0_BASE + GPIO_SWPORTA_DDR_OFFSET;
  160. }
  161. else if(bank == 1){
  162. grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2) + 0x10;
  163. ddr_phyaddr = GPIO1_BASE + GPIO_SWPORTA_DDR_OFFSET;
  164. }
  165. else if(bank == 2){
  166. grf_phyaddr = GRF_BASE + ((index >> 3) << 2);
  167. ddr_phyaddr = GPIO2_BASE + GPIO_SWPORTA_DDR_OFFSET;
  168. }
  169. else if(bank == 3){
  170. grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x10;
  171. ddr_phyaddr = GPIO3_BASE + GPIO_SWPORTA_DDR_OFFSET;
  172. }
  173. else if(bank == 4){
  174. grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x20;
  175. ddr_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET;
  176. }
  177. if (CPI_PIN_MASK[bank][index] != -1) {
  178. regval = readR(grf_phyaddr);
  179. mode = (regval >> (offset << 1)) & 0x3;
  180. if(mode == 0){
  181. regval = readR(ddr_phyaddr);
  182. return (regval >> index) & 1;
  183. }
  184. return mode + 1;
  185. }
  186. #elif (defined CONFIG_CLOCKWORKPI_A04)
  187. int offset = ((index - ((index >> 3) << 3)) << 2);
  188. if (bank == 11) {
  189. phyaddr = GPIOL_BASE + ((index >> 3) << 2);
  190. }
  191. else
  192. phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
  193. /* Ignore unused gpio */
  194. if (CPI_PIN_MASK[bank][index] != -1) {
  195. regval = readR(phyaddr);
  196. mode = (regval >> offset) & 7;
  197. }
  198. return mode;
  199. #endif
  200. }
  201. /*
  202. * Set GPIO Mode
  203. */
  204. int CPi_set_gpio_mode(int pin, int mode)
  205. {
  206. unsigned int regval = 0;
  207. unsigned int bank = pin >> 5;
  208. unsigned int index = pin - (bank << 5);
  209. unsigned int phyaddr = 0;
  210. #ifdef CONFIG_CLOCKWORKPI_A06
  211. int offset = ((index - ((index >> 3) << 3)));
  212. unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr;
  213. #elif (defined CONFIG_CLOCKWORKPI_A04)
  214. int offset = ((index - ((index >> 3) << 3)) << 2);
  215. if (bank == 11) {
  216. phyaddr = GPIOL_BASE + ((index >> 3) << 2);
  217. } else {
  218. phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
  219. }
  220. #endif
  221. #ifdef CONFIG_CLOCKWORKPI_A06
  222. if(bank == 0){
  223. cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
  224. grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2);
  225. gpio_phyaddr = GPIO0_BASE + GPIO_SWPORTA_DDR_OFFSET;
  226. }
  227. else if(bank == 1){
  228. cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
  229. grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2) + 0x10;
  230. gpio_phyaddr = GPIO1_BASE + GPIO_SWPORTA_DDR_OFFSET;
  231. }
  232. else if(bank == 2){
  233. cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
  234. grf_phyaddr = GRF_BASE + ((index >> 3) << 2);
  235. gpio_phyaddr = GPIO2_BASE + GPIO_SWPORTA_DDR_OFFSET;
  236. }
  237. else if(bank == 3){
  238. cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
  239. grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x10;
  240. gpio_phyaddr = GPIO3_BASE + GPIO_SWPORTA_DDR_OFFSET;
  241. }
  242. else if(bank == 4){
  243. cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
  244. grf_phyaddr = GRF_BASE + ((index >> 3) << 2) +0x20;
  245. gpio_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET;
  246. }
  247. #endif
  248. if (CPI_PIN_MASK[bank][index] != -1) {
  249. #ifdef CONFIG_CLOCKWORKPI_A04
  250. regval = readR(phyaddr);
  251. if (wiringPiDebug)
  252. printf("Before read reg val: 0x%x offset:%d\n",regval,offset);
  253. #endif
  254. if (wiringPiDebug)
  255. printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index);
  256. /* Set Input */
  257. if (INPUT == mode) {
  258. #ifdef CONFIG_CLOCKWORKPI_A06
  259. writeR(0xffff0180, cru_phyaddr);
  260. regval = readR(grf_phyaddr);
  261. regval |= 0x3 << ((offset << 1) | 0x10);
  262. regval &= ~(0x3 << (offset << 1));
  263. writeR(regval, grf_phyaddr);
  264. regval = readR(gpio_phyaddr);
  265. regval &= ~(1 << index);
  266. writeR(regval, gpio_phyaddr);
  267. if (wiringPiDebug){
  268. regval = readR(gpio_phyaddr);
  269. printf("Input mode set over reg val: %#x\n",regval);
  270. }
  271. #else
  272. regval &= ~(7 << offset);
  273. writeR(regval, phyaddr);
  274. regval = readR(phyaddr);
  275. if (wiringPiDebug)
  276. printf("Input mode set over reg val: %#x\n",regval);
  277. #endif
  278. } else if (OUTPUT == mode) { /* Set Output */
  279. #ifdef CONFIG_CLOCKWORKPI_A06
  280. writeR(0xffff0180, cru_phyaddr);
  281. regval = readR(grf_phyaddr);
  282. regval |= 0x3 << ((offset << 1) | 0x10);
  283. regval &= ~(0x3 << (offset << 1));
  284. writeR(regval, grf_phyaddr);
  285. regval = readR(gpio_phyaddr);
  286. regval |= 1 << index;
  287. writeR(regval, gpio_phyaddr);
  288. if (wiringPiDebug){
  289. regval = readR(gpio_phyaddr);
  290. printf("Out mode get value: 0x%x\n",regval);
  291. }
  292. #else
  293. regval &= ~(7 << offset);
  294. regval |= (1 << offset);
  295. if (wiringPiDebug)
  296. printf("Out mode ready set val: 0x%x\n",regval);
  297. writeR(regval, phyaddr);
  298. regval = readR(phyaddr);
  299. if (wiringPiDebug)
  300. printf("Out mode get value: 0x%x\n",regval);
  301. #endif
  302. }else
  303. printf("Unknow mode\n");
  304. } else
  305. printf("unused pin\n");
  306. }
  307. int CPi_set_gpio_alt(int pin, int mode)
  308. {
  309. #ifdef CONFIG_CLOCKWORKPI_A04
  310. unsigned int regval = 0;
  311. unsigned int bank = pin >> 5;
  312. unsigned int index = pin - (bank << 5);
  313. unsigned int phyaddr = 0;
  314. int offset = ((index - ((index >> 3) << 3)) << 2);
  315. if (bank == 11) {
  316. phyaddr = GPIOL_BASE + ((index >> 3) << 2);
  317. }else
  318. phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
  319. /* Ignore unused gpio */
  320. if (CPI_PIN_MASK[bank][index] != -1) {
  321. if (wiringPiDebug)
  322. printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index);
  323. regval = readR(phyaddr);
  324. regval &= ~(7 << offset);
  325. regval |= (mode << offset);
  326. writeR(regval, phyaddr);
  327. } else
  328. printf("Pin alt mode failed!\n");
  329. #endif
  330. return 0;
  331. }
  332. /*
  333. * CPi Digital write
  334. */
  335. void CPi_digitalWrite(int pin, int value)
  336. {
  337. unsigned int bank = pin >> 5;
  338. unsigned int index = pin - (bank << 5);
  339. unsigned int phyaddr = 0;
  340. #ifdef CONFIG_CLOCKWORKPI_A06
  341. unsigned int regval = 0;
  342. unsigned int cru_phyaddr = 0;
  343. #else
  344. unsigned int regval = 0;
  345. if (bank == 11) {
  346. phyaddr = GPIOL_BASE + 0x10;
  347. }
  348. else
  349. phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10;
  350. #endif
  351. #ifdef CONFIG_CLOCKWORKPI_A06
  352. if(bank == 0){
  353. phyaddr = GPIO0_BASE + GPIO_SWPORTA_DR_OFFSET;
  354. cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
  355. }
  356. else if(bank == 1){
  357. phyaddr = GPIO1_BASE + GPIO_SWPORTA_DR_OFFSET;
  358. cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
  359. }
  360. else if(bank == 2){
  361. phyaddr = GPIO2_BASE + GPIO_SWPORTA_DR_OFFSET;
  362. cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
  363. }
  364. else if(bank == 3){
  365. phyaddr = GPIO3_BASE + GPIO_SWPORTA_DR_OFFSET;
  366. cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
  367. }
  368. else if(bank == 4){
  369. phyaddr = GPIO4_BASE + GPIO_SWPORTA_DR_OFFSET;
  370. cru_phyaddr = CRU_BASE + CRU_CLKGATE_CON31_OFFSET;
  371. }
  372. #endif
  373. if (CPI_PIN_MASK[bank][index] != -1) {
  374. #ifdef CONFIG_CLOCKWORKPI_A06
  375. writeR(0xffff0180, cru_phyaddr);
  376. #endif
  377. if (wiringPiDebug)
  378. printf("pin: %d, bank: %d, index: %d, phyaddr: 0x%x\n", pin, bank, index, phyaddr);
  379. regval = readR(phyaddr);
  380. if (wiringPiDebug)
  381. printf("befor write reg val: 0x%x,index:%d\n", regval, index);
  382. if(0 == value) {
  383. regval &= ~(1 << index);
  384. writeR(regval, phyaddr);
  385. regval = readR(phyaddr);
  386. if (wiringPiDebug)
  387. printf("LOW val set over reg val: 0x%x\n", regval);
  388. } else {
  389. regval |= (1 << index);
  390. writeR(regval, phyaddr);
  391. regval = readR(phyaddr);
  392. if (wiringPiDebug)
  393. printf("HIGH val set over reg val: 0x%x\n", regval);
  394. }
  395. } else
  396. printf("unused pin\n");
  397. }
  398. /*
  399. * CPi Digital Read
  400. */
  401. int CPi_digitalRead(int pin)
  402. {
  403. int bank = pin >> 5;
  404. int index = pin - (bank << 5);
  405. int val;
  406. #ifdef CONFIG_CLOCKWORKPI_A04
  407. unsigned int phyaddr;
  408. if (bank == 11) {
  409. phyaddr = GPIOL_BASE + 0x10;
  410. } else {
  411. phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10;
  412. }
  413. #endif
  414. #ifdef CONFIG_CLOCKWORKPI_A06
  415. unsigned int phyaddr;
  416. if(bank == 0)
  417. phyaddr = GPIO0_BASE + GPIO_EXT_PORTA_OFFSET;
  418. else if(bank == 1)
  419. phyaddr = GPIO1_BASE + GPIO_EXT_PORTA_OFFSET;
  420. else if(bank == 2)
  421. phyaddr = GPIO2_BASE + GPIO_EXT_PORTA_OFFSET;
  422. else if(bank == 3)
  423. phyaddr = GPIO3_BASE + GPIO_EXT_PORTA_OFFSET;
  424. else if(bank == 4)
  425. phyaddr = GPIO4_BASE + GPIO_EXT_PORTA_OFFSET;
  426. #endif
  427. if (CPI_PIN_MASK[bank][index] != -1) {
  428. val = readR(phyaddr);
  429. val = val >> index;
  430. val &= 1;
  431. if (wiringPiDebug)
  432. printf("Read reg val: 0x%#x, bank:%d, index:%d\n", val, bank, index);
  433. return val;
  434. }
  435. return 0;
  436. }
  437. int CPiSetup(int fd)
  438. {
  439. #ifdef CONFIG_CLOCKWORKPI_A04
  440. #elif defined(CONFIG_CLOCKWORKPI_A06)
  441. gpio0_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO0_BASE);
  442. if ((int32_t)(unsigned long)gpio0_base == -1)
  443. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO0_BASE) failed: %s\n", strerror(errno));
  444. gpio1_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO1_BASE);
  445. if ((int32_t)(unsigned long)grf_base == -1)
  446. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO1_BASE) failed: %s\n", strerror(errno));
  447. gpio2_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO2_BASE);
  448. if ((int32_t)(unsigned long)gpio2_base == -1)
  449. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO2_BASE) failed: %s\n", strerror(errno));
  450. gpio3_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO3_BASE);
  451. if ((int32_t)(unsigned long)gpio3_base == -1)
  452. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO3_BASE) failed: %s\n", strerror(errno));
  453. gpio4_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO4_BASE);
  454. if ((int32_t)(unsigned long)gpio4_base == -1)
  455. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO4_BASE) failed: %s\n", strerror(errno));
  456. cru_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CRU_BASE);
  457. if ((int32_t)(unsigned long)cru_base == -1)
  458. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (CRU_BASE) failed: %s\n", strerror(errno));
  459. pmucru_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PMUCRU_BASE);
  460. if ((int32_t)(unsigned long)pmucru_base == -1)
  461. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUCRU_BASE) failed: %s\n", strerror(errno));
  462. grf_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GRF_BASE);
  463. if ((int32_t)(unsigned long)grf_base == -1)
  464. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GRF_BASE) failed: %s\n", strerror(errno));
  465. pmugrf_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PMUGRF_BASE);
  466. if ((int32_t)(unsigned long)pmugrf_base == -1)
  467. return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUGRF_BASE) failed: %s\n", strerror(errno));
  468. #endif
  469. wpimode = WPI_MODE_BCM;
  470. }
  471. void CPiSetupRaw(void)
  472. {
  473. wpimode = WPI_MODE_RAW;
  474. }
  475. void CPiPinMode(int pin, int mode)
  476. {
  477. if (wiringPiDebug)
  478. printf("CPiPinMode: pin:%d,mode:%d\n", pin, mode);
  479. if (pin >= GPIO_NUM) {
  480. printf("CPiPinMode: invaild pin:%d\n", pin);
  481. return;
  482. }
  483. if (wpimode == WPI_MODE_BCM) {
  484. if(pin >= sizeof(bcmToGpioCPi)/sizeof(bcmToGpioCPi[0])) {
  485. printf("CPiPinMode: invaild pin:%d\n", pin);
  486. return;
  487. }
  488. pin = bcmToGpioCPi[pin];
  489. }
  490. CPi_set_gpio_mode(pin, mode);
  491. }
  492. void CPiDigitalWrite(int pin, int value)
  493. {
  494. if (wiringPiDebug)
  495. printf("CPiDigitalWrite: pin:%d,value:%d\n", pin, value);
  496. if (pin >= GPIO_NUM) {
  497. printf("CPiDigitalWrite: invaild pin:%d\n", pin);
  498. return;
  499. }
  500. if (wpimode == WPI_MODE_BCM) {
  501. if(pin >= sizeof(bcmToGpioCPi)/sizeof(bcmToGpioCPi[0])) {
  502. printf("CPiDigitalWrite: invaild pin:%d\n", pin);
  503. return;
  504. }
  505. pin = bcmToGpioCPi[pin];
  506. }
  507. CPi_digitalWrite(pin, value);
  508. }
  509. int CPiDigitalRead(int pin)
  510. {
  511. int value;
  512. if (pin >= GPIO_NUM) {
  513. printf("CPiDigitalRead: invaild pin:%d\n", pin);
  514. return -1;
  515. }
  516. if (wpimode == WPI_MODE_BCM) {
  517. if(pin >= sizeof(bcmToGpioCPi)/sizeof(bcmToGpioCPi[0])) {
  518. printf("CPiDigitalRead: invaild pin:%d\n", pin);
  519. return -1;
  520. }
  521. pin = bcmToGpioCPi[pin];
  522. }
  523. value = CPi_digitalRead(pin);
  524. if (wiringPiDebug)
  525. printf("CPiDigitalRead: pin:%d,value:%d\n", pin, value);
  526. return value;
  527. }
  528. void pinModeAltCP(int pin, int mode)
  529. {
  530. }
  531. void CPiBoardId (int *model, int *rev, int *mem, int *maker, int *warranty)
  532. {
  533. #ifdef CONFIG_CLOCKWORKPI_A04
  534. *model = CPI_MODEL_A04;
  535. *rev = PI_VERSION_1;
  536. *mem = 3;
  537. *maker = 3;
  538. #elif defined(CONFIG_CLOCKWORKPI_A06)
  539. *model = CPI_MODEL_A06;
  540. *rev = PI_VERSION_1;
  541. *mem = 4;
  542. *maker = 3;
  543. #endif
  544. }