gpio.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658
  1. /*
  2. * gpio.c:
  3. * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry
  4. * Pi's GPIO.
  5. * Copyright (c) 2012-2018 Gordon Henderson
  6. ***********************************************************************
  7. * This file is part of wiringPi:
  8. * https://projects.drogon.net/raspberry-pi/wiringpi/
  9. *
  10. * wiringPi is free software: you can redistribute it and/or modify
  11. * it under the terms of the GNU Lesser General Public License as published by
  12. * the Free Software Foundation, either version 3 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * wiringPi is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU Lesser General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Lesser General Public License
  21. * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
  22. ***********************************************************************
  23. */
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <stdint.h>
  27. #include <ctype.h>
  28. #include <string.h>
  29. #include <unistd.h>
  30. #include <errno.h>
  31. #include <fcntl.h>
  32. #include <sys/types.h>
  33. #include <sys/stat.h>
  34. #include <wiringPi.h>
  35. #include <wpiExtensions.h>
  36. #include <gertboard.h>
  37. #include <piFace.h>
  38. #include "../version.h"
  39. #ifdef CONFIG_CLOCKWORKPI
  40. #include "CPi.h"
  41. #endif
  42. extern int wiringPiDebug ;
  43. // External functions I can't be bothered creating a separate .h file for:
  44. extern void doReadall (void) ;
  45. extern void doAllReadall (void) ;
  46. extern void doQmode (int argc, char *argv []) ;
  47. #ifndef TRUE
  48. # define TRUE (1==1)
  49. # define FALSE (1==2)
  50. #endif
  51. #define PI_USB_POWER_CONTROL 38
  52. #define I2CDETECT "i2cdetect"
  53. #define MODPROBE "modprobe"
  54. #define RMMOD "rmmod"
  55. int wpMode ;
  56. char *usage = "Usage: gpio -v\n"
  57. " gpio -h\n"
  58. " gpio [-g|-1] ...\n"
  59. " gpio [-d] ...\n"
  60. " [-x extension:params] [[ -x ...]] ...\n"
  61. " gpio [-p] <read/write/wb> ...\n"
  62. " gpio <mode/read/write/aread/awritewb/pwm/pwmTone/clock> ...\n"
  63. " gpio <toggle/blink> <pin>\n"
  64. " gpio readall\n"
  65. " gpio unexportall/exports\n"
  66. " gpio export/edge/unexport ...\n"
  67. " gpio wfi <pin> <mode>\n"
  68. " gpio drive <group> <value>\n"
  69. " gpio pwm-bal/pwm-ms \n"
  70. " gpio pwmr <range> \n"
  71. " gpio pwmc <divider> \n"
  72. " gpio load spi/i2c\n"
  73. " gpio unload spi/i2c\n"
  74. " gpio i2cd/i2cdetect\n"
  75. " gpio rbx/rbd\n"
  76. " gpio wb <value>\n"
  77. " gpio usbp high/low\n"
  78. " gpio gbr <channel>\n"
  79. " gpio gbw <channel> <value>" ; // No trailing newline needed here.
  80. #ifdef NOT_FOR_NOW
  81. /*
  82. * decodePin:
  83. * Decode a pin "number" which can actually be a pin name to represent
  84. * one of the Pi's on-board pins.
  85. *********************************************************************************
  86. */
  87. static int decodePin (const char *str)
  88. {
  89. // The first case - see if it's a number:
  90. if (isdigit (str [0]))
  91. return atoi (str) ;
  92. return 0 ;
  93. }
  94. #endif
  95. /*
  96. * findExecutable:
  97. * Code to locate the path to the given executable. We have a fixed list
  98. * of locations to try which completely overrides any $PATH environment.
  99. * This may be detrimental, however it avoids the reliance on $PATH
  100. * which may be a security issue when this program is run a set-uid-root.
  101. *********************************************************************************
  102. */
  103. static const char *searchPath [] =
  104. {
  105. "/sbin",
  106. "/usr/sbin",
  107. "/bin",
  108. "/usr/bin",
  109. NULL,
  110. } ;
  111. static char *findExecutable (const char *progName)
  112. {
  113. static char *path = NULL ;
  114. int len = strlen (progName) ;
  115. int i = 0 ;
  116. struct stat statBuf ;
  117. for (i = 0 ; searchPath [i] != NULL ; ++i)
  118. {
  119. path = malloc (strlen (searchPath [i]) + len + 2) ;
  120. sprintf (path, "%s/%s", searchPath [i], progName) ;
  121. if (stat (path, &statBuf) == 0)
  122. return path ;
  123. free (path) ;
  124. }
  125. return NULL ;
  126. }
  127. /*
  128. * changeOwner:
  129. * Change the ownership of the file to the real userId of the calling
  130. * program so we can access it.
  131. *********************************************************************************
  132. */
  133. static void changeOwner (char *cmd, char *file)
  134. {
  135. uid_t uid = getuid () ;
  136. uid_t gid = getgid () ;
  137. if (chown (file, uid, gid) != 0)
  138. {
  139. // Removed (ignoring) the check for not existing as I'm fed-up with morons telling me that
  140. // the warning message is an error.
  141. if (errno != ENOENT)
  142. fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ;
  143. }
  144. }
  145. /*
  146. * moduleLoaded:
  147. * Return true/false if the supplied module is loaded
  148. *********************************************************************************
  149. */
  150. static int moduleLoaded (char *modName)
  151. {
  152. int len = strlen (modName) ;
  153. int found = FALSE ;
  154. FILE *fd = fopen ("/proc/modules", "r") ;
  155. char line [80] ;
  156. if (fd == NULL)
  157. {
  158. fprintf (stderr, "gpio: Unable to check /proc/modules: %s\n", strerror (errno)) ;
  159. exit (1) ;
  160. }
  161. while (fgets (line, 80, fd) != NULL)
  162. {
  163. if (strncmp (line, modName, len) != 0)
  164. continue ;
  165. found = TRUE ;
  166. break ;
  167. }
  168. fclose (fd) ;
  169. return found ;
  170. }
  171. /*
  172. * doLoad:
  173. * Load either the spi or i2c modules and change device ownerships, etc.
  174. *********************************************************************************
  175. */
  176. static void checkDevTree (char *argv [])
  177. {
  178. struct stat statBuf ;
  179. if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ...
  180. {
  181. fprintf (stderr,
  182. "%s: Unable to load/unload modules as this Pi has the device tree enabled.\n"
  183. " You need to run the raspi-config program (as root) and select the\n"
  184. " modules (SPI or I2C) that you wish to load/unload there and reboot.\n", argv [0]) ;
  185. exit (1) ;
  186. }
  187. }
  188. static void _doLoadUsage (char *argv [])
  189. {
  190. fprintf (stderr, "Usage: %s load <spi/i2c> [I2C baudrate in Kb/sec]\n", argv [0]) ;
  191. exit (1) ;
  192. }
  193. static void doLoad (int argc, char *argv [])
  194. {
  195. char *module1, *module2 ;
  196. char cmd [80] ;
  197. char *file1, *file2 ;
  198. char args1 [32], args2 [32] ;
  199. checkDevTree (argv) ;
  200. if (argc < 3)
  201. _doLoadUsage (argv) ;
  202. args1 [0] = args2 [0] = 0 ;
  203. /**/ if (strcasecmp (argv [2], "spi") == 0)
  204. {
  205. module1 = "spidev" ;
  206. module2 = "spi_bcm2708" ;
  207. file1 = "/dev/spidev0.0" ;
  208. file2 = "/dev/spidev0.1" ;
  209. if (argc == 4)
  210. {
  211. fprintf (stderr, "%s: Unable to set the buffer size now. Load aborted. Please see the man page.\n", argv [0]) ;
  212. exit (1) ;
  213. }
  214. else if (argc > 4)
  215. _doLoadUsage (argv) ;
  216. }
  217. else if (strcasecmp (argv [2], "i2c") == 0)
  218. {
  219. module1 = "i2c_dev" ;
  220. module2 = "i2c_bcm2708" ;
  221. file1 = "/dev/i2c-0" ;
  222. file2 = "/dev/i2c-1" ;
  223. if (argc == 4)
  224. sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ;
  225. else if (argc > 4)
  226. _doLoadUsage (argv) ;
  227. }
  228. else
  229. _doLoadUsage (argv) ;
  230. if (findExecutable ("modprobe") == NULL)
  231. printf ("No found\n") ;
  232. if (!moduleLoaded (module1))
  233. {
  234. sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module1, args1) ;
  235. system (cmd) ;
  236. }
  237. if (!moduleLoaded (module2))
  238. {
  239. sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module2, args2) ;
  240. system (cmd) ;
  241. }
  242. if (!moduleLoaded (module2))
  243. {
  244. fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ;
  245. exit (1) ;
  246. }
  247. sleep (1) ; // To let things get settled
  248. changeOwner (argv [0], file1) ;
  249. changeOwner (argv [0], file2) ;
  250. }
  251. /*
  252. * doUnLoad:
  253. * Un-Load either the spi or i2c modules and change device ownerships, etc.
  254. *********************************************************************************
  255. */
  256. static void _doUnLoadUsage (char *argv [])
  257. {
  258. fprintf (stderr, "Usage: %s unload <spi/i2c>\n", argv [0]) ;
  259. exit (1) ;
  260. }
  261. static void doUnLoad (int argc, char *argv [])
  262. {
  263. char *module1, *module2 ;
  264. char cmd [80] ;
  265. checkDevTree (argv) ;
  266. if (argc != 3)
  267. _doUnLoadUsage (argv) ;
  268. /**/ if (strcasecmp (argv [2], "spi") == 0)
  269. {
  270. module1 = "spidev" ;
  271. module2 = "spi_bcm2708" ;
  272. }
  273. else if (strcasecmp (argv [2], "i2c") == 0)
  274. {
  275. module1 = "i2c_dev" ;
  276. module2 = "i2c_bcm2708" ;
  277. }
  278. else
  279. _doUnLoadUsage (argv) ;
  280. if (moduleLoaded (module1))
  281. {
  282. sprintf (cmd, "%s %s", findExecutable (RMMOD), module1) ;
  283. system (cmd) ;
  284. }
  285. if (moduleLoaded (module2))
  286. {
  287. sprintf (cmd, "%s %s", findExecutable (RMMOD), module2) ;
  288. system (cmd) ;
  289. }
  290. }
  291. /*
  292. * doI2Cdetect:
  293. * Run the i2cdetect command with the right runes for this Pi revision
  294. *********************************************************************************
  295. */
  296. static void doI2Cdetect (UNU int argc, char *argv [])
  297. {
  298. int port = piGpioLayout () == 1 ? 0 : 1 ;
  299. char *c, *command ;
  300. if ((c = findExecutable (I2CDETECT)) == NULL)
  301. {
  302. fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ;
  303. return ;
  304. }
  305. if (!moduleLoaded ("i2c_dev"))
  306. {
  307. fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ;
  308. return ;
  309. }
  310. command = malloc (strlen (c) + 16) ;
  311. sprintf (command, "%s -y %d", c, port) ;
  312. if (system (command) < 0)
  313. fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ;
  314. }
  315. /*
  316. * doExports:
  317. * List all GPIO exports
  318. *********************************************************************************
  319. */
  320. static void doExports (UNU int argc, UNU char *argv [])
  321. {
  322. int fd ;
  323. int i, l, first ;
  324. char fName [128] ;
  325. char buf [16] ;
  326. for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective
  327. {
  328. // Try to read the direction
  329. sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ;
  330. if ((fd = open (fName, O_RDONLY)) == -1)
  331. continue ;
  332. if (first == 0)
  333. {
  334. ++first ;
  335. printf ("GPIO Pins exported:\n") ;
  336. }
  337. printf ("%4d: ", i) ;
  338. if ((l = read (fd, buf, 16)) == 0)
  339. sprintf (buf, "%s", "?") ;
  340. buf [l] = 0 ;
  341. if ((buf [strlen (buf) - 1]) == '\n')
  342. buf [strlen (buf) - 1] = 0 ;
  343. printf ("%-3s", buf) ;
  344. close (fd) ;
  345. // Try to Read the value
  346. sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ;
  347. if ((fd = open (fName, O_RDONLY)) == -1)
  348. {
  349. printf ("No Value file (huh?)\n") ;
  350. continue ;
  351. }
  352. if ((l = read (fd, buf, 16)) == 0)
  353. sprintf (buf, "%s", "?") ;
  354. buf [l] = 0 ;
  355. if ((buf [strlen (buf) - 1]) == '\n')
  356. buf [strlen (buf) - 1] = 0 ;
  357. printf (" %s", buf) ;
  358. // Read any edge trigger file
  359. sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ;
  360. if ((fd = open (fName, O_RDONLY)) == -1)
  361. {
  362. printf ("\n") ;
  363. continue ;
  364. }
  365. if ((l = read (fd, buf, 16)) == 0)
  366. sprintf (buf, "%s", "?") ;
  367. buf [l] = 0 ;
  368. if ((buf [strlen (buf) - 1]) == '\n')
  369. buf [strlen (buf) - 1] = 0 ;
  370. printf (" %-8s\n", buf) ;
  371. close (fd) ;
  372. }
  373. }
  374. /*
  375. * doExport:
  376. * gpio export pin mode
  377. * This uses the /sys/class/gpio device interface.
  378. *********************************************************************************
  379. */
  380. void doExport (int argc, char *argv [])
  381. {
  382. FILE *fd ;
  383. int pin ;
  384. char *mode ;
  385. char fName [128] ;
  386. if (argc != 4)
  387. {
  388. fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ;
  389. exit (1) ;
  390. }
  391. pin = atoi (argv [2]) ;
  392. mode = argv [3] ;
  393. if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL)
  394. {
  395. fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
  396. exit (1) ;
  397. }
  398. fprintf (fd, "%d\n", pin) ;
  399. fclose (fd) ;
  400. sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
  401. if ((fd = fopen (fName, "w")) == NULL)
  402. {
  403. fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
  404. exit (1) ;
  405. }
  406. /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0))
  407. fprintf (fd, "in\n") ;
  408. else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0))
  409. fprintf (fd, "out\n") ;
  410. else if ((strcasecmp (mode, "high") == 0) || (strcasecmp (mode, "up") == 0))
  411. fprintf (fd, "high\n") ;
  412. else if ((strcasecmp (mode, "low") == 0) || (strcasecmp (mode, "down") == 0))
  413. fprintf (fd, "low\n") ;
  414. else
  415. {
  416. fprintf (stderr, "%s: Invalid mode: %s. Should be in, out, high or low\n", argv [1], mode) ;
  417. exit (1) ;
  418. }
  419. fclose (fd) ;
  420. // Change ownership so the current user can actually use it
  421. sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
  422. changeOwner (argv [0], fName) ;
  423. sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
  424. changeOwner (argv [0], fName) ;
  425. }
  426. /*
  427. * doWfi:
  428. * gpio wfi pin mode
  429. * Wait for Interrupt on a given pin.
  430. * Slight cheat here - it's easier to actually use ISR now (which calls
  431. * gpio to set the pin modes!) then we simply sleep, and expect the thread
  432. * to exit the program. Crude but effective.
  433. *********************************************************************************
  434. */
  435. static void wfi (void)
  436. { exit (0) ; }
  437. void doWfi (int argc, char *argv [])
  438. {
  439. int pin, mode ;
  440. if (argc != 4)
  441. {
  442. fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ;
  443. exit (1) ;
  444. }
  445. pin = atoi (argv [2]) ;
  446. /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ;
  447. else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ;
  448. else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ;
  449. else
  450. {
  451. fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ;
  452. exit (1) ;
  453. }
  454. if (wiringPiISR (pin, mode, &wfi) < 0)
  455. {
  456. fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ;
  457. exit (1) ;
  458. }
  459. for (;;)
  460. delay (9999) ;
  461. }
  462. /*
  463. * doEdge:
  464. * gpio edge pin mode
  465. * Easy access to changing the edge trigger on a GPIO pin
  466. * This uses the /sys/class/gpio device interface.
  467. *********************************************************************************
  468. */
  469. void doEdge (int argc, char *argv [])
  470. {
  471. FILE *fd ;
  472. int pin ;
  473. char *mode ;
  474. char fName [128] ;
  475. if (argc != 4)
  476. {
  477. fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ;
  478. exit (1) ;
  479. }
  480. pin = atoi (argv [2]) ;
  481. mode = argv [3] ;
  482. // Export the pin and set direction to input
  483. if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL)
  484. {
  485. fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
  486. exit (1) ;
  487. }
  488. fprintf (fd, "%d\n", pin) ;
  489. fclose (fd) ;
  490. sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
  491. if ((fd = fopen (fName, "w")) == NULL)
  492. {
  493. fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
  494. exit (1) ;
  495. }
  496. fprintf (fd, "in\n") ;
  497. fclose (fd) ;
  498. sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
  499. if ((fd = fopen (fName, "w")) == NULL)
  500. {
  501. fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
  502. exit (1) ;
  503. }
  504. /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ;
  505. else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ;
  506. else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ;
  507. else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ;
  508. else
  509. {
  510. fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ;
  511. exit (1) ;
  512. }
  513. // Change ownership of the value and edge files, so the current user can actually use it!
  514. sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
  515. changeOwner (argv [0], fName) ;
  516. sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
  517. changeOwner (argv [0], fName) ;
  518. fclose (fd) ;
  519. }
  520. /*
  521. * doUnexport:
  522. * gpio unexport pin
  523. * This uses the /sys/class/gpio device interface.
  524. *********************************************************************************
  525. */
  526. void doUnexport (int argc, char *argv [])
  527. {
  528. FILE *fd ;
  529. int pin ;
  530. if (argc != 3)
  531. {
  532. fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ;
  533. exit (1) ;
  534. }
  535. pin = atoi (argv [2]) ;
  536. if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
  537. {
  538. fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ;
  539. exit (1) ;
  540. }
  541. fprintf (fd, "%d\n", pin) ;
  542. fclose (fd) ;
  543. }
  544. /*
  545. * doUnexportAll:
  546. * gpio unexportall
  547. * Un-Export all the GPIO pins.
  548. * This uses the /sys/class/gpio device interface.
  549. *********************************************************************************
  550. */
  551. void doUnexportall (char *progName)
  552. {
  553. FILE *fd ;
  554. int pin ;
  555. for (pin = 0 ; pin < 63 ; ++pin)
  556. {
  557. if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
  558. {
  559. fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ;
  560. exit (1) ;
  561. }
  562. fprintf (fd, "%d\n", pin) ;
  563. fclose (fd) ;
  564. }
  565. }
  566. /*
  567. * doReset:
  568. * Reset the GPIO pins - as much as we can do
  569. *********************************************************************************
  570. */
  571. static void doReset (UNU char *progName)
  572. {
  573. printf ("GPIO Reset is dangerous and has been removed from the gpio command.\n") ;
  574. printf (" - Please write a shell-script to reset the GPIO pins into the state\n") ;
  575. printf (" that you need them in for your applications.\n") ;
  576. }
  577. /*
  578. * doMode:
  579. * gpio mode pin mode ...
  580. *********************************************************************************
  581. */
  582. void doMode (int argc, char *argv [])
  583. {
  584. int pin ;
  585. char *mode ;
  586. if (argc != 4)
  587. {
  588. fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ;
  589. exit (1) ;
  590. }
  591. pin = atoi (argv [2]) ;
  592. mode = argv [3] ;
  593. #ifdef CONFIG_CLOCKWORKPI
  594. if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
  595. else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ;
  596. else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ;
  597. else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ;
  598. else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b010) ;
  599. else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b011) ;
  600. else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b100) ;
  601. else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b101) ;
  602. else if (strcasecmp (mode, "alt6") == 0) pinModeAlt (pin, 0b110) ;
  603. else if (strcasecmp (mode, "alt7") == 0) pinModeAlt (pin, 0b111) ;
  604. #else
  605. /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
  606. else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ;
  607. else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ;
  608. else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ;
  609. else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ;
  610. else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ;
  611. else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ;
  612. else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ;
  613. else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ;
  614. else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ;
  615. else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ;
  616. else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ;
  617. else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ;
  618. else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ;
  619. else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ;
  620. else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ;
  621. else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ;
  622. #endif
  623. else
  624. {
  625. fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
  626. exit (1) ;
  627. }
  628. }
  629. /*
  630. * doPadDrive:
  631. * gpio drive group value
  632. *********************************************************************************
  633. */
  634. static void doPadDrive (int argc, char *argv [])
  635. {
  636. int group, val ;
  637. if (argc != 4)
  638. {
  639. fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ;
  640. exit (1) ;
  641. }
  642. group = atoi (argv [2]) ;
  643. val = atoi (argv [3]) ;
  644. if ((group < 0) || (group > 2))
  645. {
  646. fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ;
  647. exit (1) ;
  648. }
  649. if ((val < 0) || (val > 7))
  650. {
  651. fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ;
  652. exit (1) ;
  653. }
  654. setPadDrive (group, val) ;
  655. }
  656. /*
  657. * doUsbP:
  658. * Control USB Power - High (1.2A) or Low (600mA)
  659. * gpio usbp high/low
  660. *********************************************************************************
  661. */
  662. static void doUsbP (int argc, char *argv [])
  663. {
  664. int model, rev, mem, maker, overVolted ;
  665. if (argc != 3)
  666. {
  667. fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
  668. exit (1) ;
  669. }
  670. // Make sure we're on a B+
  671. piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
  672. if (!((model == PI_MODEL_BP) || (model == PI_MODEL_2)))
  673. {
  674. fprintf (stderr, "USB power contol is applicable to B+ and v2 boards only.\n") ;
  675. exit (1) ;
  676. }
  677. // Make sure we start in BCM_GPIO mode
  678. wiringPiSetupGpio () ;
  679. if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0))
  680. {
  681. digitalWrite (PI_USB_POWER_CONTROL, 1) ;
  682. pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
  683. printf ("Switched to HIGH current USB (1.2A)\n") ;
  684. return ;
  685. }
  686. if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0))
  687. {
  688. digitalWrite (PI_USB_POWER_CONTROL, 0) ;
  689. pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
  690. printf ("Switched to LOW current USB (600mA)\n") ;
  691. return ;
  692. }
  693. fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
  694. exit (1) ;
  695. }
  696. /*
  697. * doGbw:
  698. * gpio gbw channel value
  699. * Gertboard Write - To the Analog output
  700. *********************************************************************************
  701. */
  702. static void doGbw (int argc, char *argv [])
  703. {
  704. int channel, value ;
  705. if (argc != 4)
  706. {
  707. fprintf (stderr, "Usage: %s gbw <channel> <value>\n", argv [0]) ;
  708. exit (1) ;
  709. }
  710. channel = atoi (argv [2]) ;
  711. value = atoi (argv [3]) ;
  712. if ((channel < 0) || (channel > 1))
  713. {
  714. fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ;
  715. exit (1) ;
  716. }
  717. if ((value < 0) || (value > 255))
  718. {
  719. fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ;
  720. exit (1) ;
  721. }
  722. if (gertboardAnalogSetup (64) < 0)
  723. {
  724. fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
  725. exit (1) ;
  726. }
  727. analogWrite (64 + channel, value) ;
  728. }
  729. /*
  730. * doGbr:
  731. * gpio gbr channel
  732. * From the analog input
  733. *********************************************************************************
  734. */
  735. static void doGbr (int argc, char *argv [])
  736. {
  737. int channel ;
  738. if (argc != 3)
  739. {
  740. fprintf (stderr, "Usage: %s gbr <channel>\n", argv [0]) ;
  741. exit (1) ;
  742. }
  743. channel = atoi (argv [2]) ;
  744. if ((channel < 0) || (channel > 1))
  745. {
  746. fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ;
  747. exit (1) ;
  748. }
  749. if (gertboardAnalogSetup (64) < 0)
  750. {
  751. fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
  752. exit (1) ;
  753. }
  754. printf ("%d\n", analogRead (64 + channel)) ;
  755. }
  756. /*
  757. * doWrite:
  758. * gpio write pin value
  759. *********************************************************************************
  760. */
  761. static void doWrite (int argc, char *argv [])
  762. {
  763. int pin, val ;
  764. if (argc != 4)
  765. {
  766. fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ;
  767. exit (1) ;
  768. }
  769. pin = atoi (argv [2]) ;
  770. /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0))
  771. val = 1 ;
  772. else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0))
  773. val = 0 ;
  774. else
  775. val = atoi (argv [3]) ;
  776. /**/ if (val == 0)
  777. digitalWrite (pin, LOW) ;
  778. else
  779. digitalWrite (pin, HIGH) ;
  780. }
  781. /*
  782. * doAwriterite:
  783. * gpio awrite pin value
  784. *********************************************************************************
  785. */
  786. static void doAwrite (int argc, char *argv [])
  787. {
  788. int pin, val ;
  789. if (argc != 4)
  790. {
  791. fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ;
  792. exit (1) ;
  793. }
  794. pin = atoi (argv [2]) ;
  795. val = atoi (argv [3]) ;
  796. analogWrite (pin, val) ;
  797. }
  798. /*
  799. * doWriteByte:
  800. * gpio wb value
  801. *********************************************************************************
  802. */
  803. static void doWriteByte (int argc, char *argv [])
  804. {
  805. int val ;
  806. if (argc != 3)
  807. {
  808. fprintf (stderr, "Usage: %s wb value\n", argv [0]) ;
  809. exit (1) ;
  810. }
  811. val = (int)strtol (argv [2], NULL, 0) ;
  812. digitalWriteByte (val) ;
  813. }
  814. /*
  815. * doReadByte:
  816. * gpio rbx|rbd value
  817. *********************************************************************************
  818. */
  819. static void doReadByte (int argc, char *argv [], int printHex)
  820. {
  821. int val ;
  822. if (argc != 2)
  823. {
  824. fprintf (stderr, "Usage: %s rbx|rbd\n", argv [0]) ;
  825. exit (1) ;
  826. }
  827. val = digitalReadByte () ;
  828. if (printHex)
  829. printf ("%02X\n", val) ;
  830. else
  831. printf ("%d\n", val) ;
  832. }
  833. /*
  834. * doRead:
  835. * Read a pin and return the value
  836. *********************************************************************************
  837. */
  838. void doRead (int argc, char *argv [])
  839. {
  840. int pin, val ;
  841. if (argc != 3)
  842. {
  843. fprintf (stderr, "Usage: %s read pin\n", argv [0]) ;
  844. exit (1) ;
  845. }
  846. pin = atoi (argv [2]) ;
  847. val = digitalRead (pin) ;
  848. printf ("%s\n", val == 0 ? "0" : "1") ;
  849. }
  850. /*
  851. * doAread:
  852. * Read an analog pin and return the value
  853. *********************************************************************************
  854. */
  855. void doAread (int argc, char *argv [])
  856. {
  857. if (argc != 3)
  858. {
  859. fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ;
  860. exit (1) ;
  861. }
  862. printf ("%d\n", analogRead (atoi (argv [2]))) ;
  863. }
  864. /*
  865. * doToggle:
  866. * Toggle an IO pin
  867. *********************************************************************************
  868. */
  869. void doToggle (int argc, char *argv [])
  870. {
  871. int pin ;
  872. if (argc != 3)
  873. {
  874. fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ;
  875. exit (1) ;
  876. }
  877. pin = atoi (argv [2]) ;
  878. digitalWrite (pin, !digitalRead (pin)) ;
  879. }
  880. /*
  881. * doBlink:
  882. * Blink an IO pin
  883. *********************************************************************************
  884. */
  885. void doBlink (int argc, char *argv [])
  886. {
  887. int pin ;
  888. if (argc != 3)
  889. {
  890. fprintf (stderr, "Usage: %s blink pin\n", argv [0]) ;
  891. exit (1) ;
  892. }
  893. pin = atoi (argv [2]) ;
  894. pinMode (pin, OUTPUT) ;
  895. for (;;)
  896. {
  897. digitalWrite (pin, !digitalRead (pin)) ;
  898. delay (500) ;
  899. }
  900. }
  901. /*
  902. * doPwmTone:
  903. * Output a tone in a PWM pin
  904. *********************************************************************************
  905. */
  906. void doPwmTone (int argc, char *argv [])
  907. {
  908. int pin, freq ;
  909. if (argc != 4)
  910. {
  911. fprintf (stderr, "Usage: %s pwmTone <pin> <freq>\n", argv [0]) ;
  912. exit (1) ;
  913. }
  914. pin = atoi (argv [2]) ;
  915. freq = atoi (argv [3]) ;
  916. pwmToneWrite (pin, freq) ;
  917. }
  918. /*
  919. * doClock:
  920. * Output a clock on a pin
  921. *********************************************************************************
  922. */
  923. void doClock (int argc, char *argv [])
  924. {
  925. int pin, freq ;
  926. if (argc != 4)
  927. {
  928. fprintf (stderr, "Usage: %s clock <pin> <freq>\n", argv [0]) ;
  929. exit (1) ;
  930. }
  931. pin = atoi (argv [2]) ;
  932. freq = atoi (argv [3]) ;
  933. gpioClockSet (pin, freq) ;
  934. }
  935. /*
  936. * doPwm:
  937. * Output a PWM value on a pin
  938. *********************************************************************************
  939. */
  940. void doPwm (int argc, char *argv [])
  941. {
  942. int pin, val ;
  943. if (argc != 4)
  944. {
  945. fprintf (stderr, "Usage: %s pwm <pin> <value>\n", argv [0]) ;
  946. exit (1) ;
  947. }
  948. pin = atoi (argv [2]) ;
  949. val = atoi (argv [3]) ;
  950. pwmWrite (pin, val) ;
  951. }
  952. /*
  953. * doPwmMode: doPwmRange: doPwmClock:
  954. * Change the PWM mode, range and clock divider values
  955. *********************************************************************************
  956. */
  957. static void doPwmMode (int mode)
  958. {
  959. pwmSetMode (mode) ;
  960. }
  961. static void doPwmRange (int argc, char *argv [])
  962. {
  963. unsigned int range ;
  964. if (argc != 3)
  965. {
  966. fprintf (stderr, "Usage: %s pwmr <range>\n", argv [0]) ;
  967. exit (1) ;
  968. }
  969. range = (unsigned int)strtoul (argv [2], NULL, 10) ;
  970. if (range == 0)
  971. {
  972. fprintf (stderr, "%s: range must be > 0\n", argv [0]) ;
  973. exit (1) ;
  974. }
  975. pwmSetRange (range) ;
  976. }
  977. static void doPwmClock (int argc, char *argv [])
  978. {
  979. unsigned int clock ;
  980. if (argc != 3)
  981. {
  982. fprintf (stderr, "Usage: %s pwmc <clock>\n", argv [0]) ;
  983. exit (1) ;
  984. }
  985. clock = (unsigned int)strtoul (argv [2], NULL, 10) ;
  986. if ((clock < 1) || (clock > 4095))
  987. {
  988. fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ;
  989. exit (1) ;
  990. }
  991. pwmSetClock (clock) ;
  992. }
  993. /*
  994. * doVersion:
  995. * Handle the ever more complicated version command and print out
  996. * some usefull information.
  997. *********************************************************************************
  998. */
  999. static void doVersion (char *argv [])
  1000. {
  1001. int model, rev, mem, maker, warranty ;
  1002. struct stat statBuf ;
  1003. char name [80] ;
  1004. FILE *fd ;
  1005. int vMaj, vMin ;
  1006. wiringPiVersion (&vMaj, &vMin) ;
  1007. printf ("gpio version: %d.%d\n", vMaj, vMin) ;
  1008. printf ("Copyright (c) 2012-2018 Gordon Henderson\n") ;
  1009. printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
  1010. printf ("For details type: %s -warranty\n", argv [0]) ;
  1011. printf ("\n") ;
  1012. piBoardId (&model, &rev, &mem, &maker, &warranty) ;
  1013. printf ("Raspberry Pi Details:\n") ;
  1014. printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n",
  1015. piModelNames [model], piRevisionNames [rev], piMemorySize [mem], piMakerNames [maker], warranty ? "[Out of Warranty]" : "") ;
  1016. // Check for device tree
  1017. if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ...
  1018. printf (" * Device tree is enabled.\n") ;
  1019. if (stat ("/proc/device-tree/model", &statBuf) == 0) // Output Kernel idea of board type
  1020. {
  1021. if ((fd = fopen ("/proc/device-tree/model", "r")) != NULL)
  1022. {
  1023. fgets (name, 80, fd) ;
  1024. fclose (fd) ;
  1025. printf (" *--> %s\n", name) ;
  1026. }
  1027. }
  1028. if (stat ("/dev/gpiomem", &statBuf) == 0) // User level GPIO is GO
  1029. printf (" * This Raspberry Pi supports user-level GPIO access.\n") ;
  1030. else
  1031. printf (" * Root or sudo required for GPIO access.\n") ;
  1032. }
  1033. static void doReadRaw (int argc, char *argv [])
  1034. {
  1035. #ifdef CONFIG_CLOCKWORKPI
  1036. int pin, val ;
  1037. if (argc != 3) {
  1038. fprintf (stderr, "Usage: %s readraw pin\n", argv [0]) ;
  1039. exit (1) ;
  1040. }
  1041. pin = atoi (argv [2]) ;
  1042. val = CPi_digitalRead(pin);
  1043. printf ("%s\n", val == 0 ? "0" : "1") ;
  1044. #endif
  1045. }
  1046. static void doWriteRaw (int argc, char *argv [])
  1047. {
  1048. #ifdef CONFIG_CLOCKWORKPI
  1049. int pin, val ;
  1050. if (argc != 4) {
  1051. fprintf (stderr, "Usage: %s writeraw pin value\n", argv [0]) ;
  1052. exit (1) ;
  1053. }
  1054. pin = atoi (argv [2]) ;
  1055. if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0))
  1056. val = 1 ;
  1057. else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0))
  1058. val = 0 ;
  1059. else
  1060. val = atoi (argv [3]) ;
  1061. if (val == 0)
  1062. CPi_digitalWrite (pin, LOW) ;
  1063. else
  1064. CPi_digitalWrite (pin, HIGH) ;
  1065. #endif
  1066. }
  1067. static void doModeRaw (int argc, char *argv [])
  1068. {
  1069. #ifdef CONFIG_CLOCKWORKPI
  1070. int pin ;
  1071. char *mode ;
  1072. if (argc != 4)
  1073. {
  1074. fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ;
  1075. exit (1) ;
  1076. }
  1077. wiringPiSetupRaw();
  1078. pin = atoi (argv [2]) ;
  1079. mode = argv [3] ;
  1080. /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
  1081. else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ;
  1082. else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ;
  1083. else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ;
  1084. else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ;
  1085. else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ;
  1086. else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ;
  1087. else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ;
  1088. else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ;
  1089. else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ;
  1090. else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ;
  1091. else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b010) ;
  1092. else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b011) ;
  1093. else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b100) ;
  1094. else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b101) ;
  1095. else if (strcasecmp (mode, "alt6") == 0) pinModeAlt (pin, 0b110) ;
  1096. else if (strcasecmp (mode, "alt7") == 0) pinModeAlt (pin, 0b111) ;
  1097. else
  1098. {
  1099. fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
  1100. exit (1) ;
  1101. }
  1102. #endif
  1103. }
  1104. /*
  1105. * main:
  1106. * Start here
  1107. *********************************************************************************
  1108. */
  1109. int main (int argc, char *argv [])
  1110. {
  1111. int i ;
  1112. if (getenv ("WIRINGPI_DEBUG") != NULL)
  1113. {
  1114. printf ("gpio: wiringPi debug mode enabled\n") ;
  1115. wiringPiDebug = TRUE ;
  1116. }
  1117. if (argc == 1)
  1118. {
  1119. fprintf (stderr,
  1120. "%s: At your service!\n"
  1121. " Type: gpio -h for full details and\n"
  1122. " gpio readall for a quick printout of your connector details\n", argv [0]) ;
  1123. exit (EXIT_FAILURE) ;
  1124. }
  1125. // Help
  1126. if (strcasecmp (argv [1], "-h") == 0)
  1127. {
  1128. printf ("%s: %s\n", argv [0], usage) ;
  1129. exit (EXIT_SUCCESS) ;
  1130. }
  1131. // Version & Warranty
  1132. // Wish I could remember why I have both -R and -V ...
  1133. if ((strcmp (argv [1], "-R") == 0) || (strcmp (argv [1], "-V") == 0))
  1134. {
  1135. printf ("%d\n", piGpioLayout ()) ;
  1136. exit (EXIT_SUCCESS) ;
  1137. }
  1138. // Version and information
  1139. if (strcmp (argv [1], "-v") == 0)
  1140. {
  1141. doVersion (argv) ;
  1142. exit (EXIT_SUCCESS) ;
  1143. }
  1144. if (strcasecmp (argv [1], "-warranty") == 0)
  1145. {
  1146. printf ("gpio version: %s\n", VERSION) ;
  1147. printf ("Copyright (c) 2012-2018 Gordon Henderson\n") ;
  1148. printf ("\n") ;
  1149. printf (" This program is free software; you can redistribute it and/or modify\n") ;
  1150. printf (" it under the terms of the GNU Leser General Public License as published\n") ;
  1151. printf (" by the Free Software Foundation, either version 3 of the License, or\n") ;
  1152. printf (" (at your option) any later version.\n") ;
  1153. printf ("\n") ;
  1154. printf (" This program is distributed in the hope that it will be useful,\n") ;
  1155. printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ;
  1156. printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ;
  1157. printf (" GNU Lesser General Public License for more details.\n") ;
  1158. printf ("\n") ;
  1159. printf (" You should have received a copy of the GNU Lesser General Public License\n") ;
  1160. printf (" along with this program. If not, see <http://www.gnu.org/licenses/>.\n") ;
  1161. printf ("\n") ;
  1162. exit (EXIT_SUCCESS) ;
  1163. }
  1164. if (geteuid () != 0)
  1165. {
  1166. fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ;
  1167. exit (EXIT_FAILURE) ;
  1168. }
  1169. #ifndef CONFIG_CLOCKWORKPI
  1170. // Initial test for /sys/class/gpio operations:
  1171. /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; }
  1172. else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; }
  1173. else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; }
  1174. else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; }
  1175. else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; }
  1176. // Check for load command:
  1177. if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; }
  1178. if (strcasecmp (argv [1], "unload" ) == 0) { doUnLoad (argc, argv) ; return 0 ; }
  1179. // Check for usb power command
  1180. if (strcasecmp (argv [1], "usbp" ) == 0) { doUsbP (argc, argv) ; return 0 ; }
  1181. // Gertboard commands
  1182. if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; }
  1183. if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; }
  1184. #endif
  1185. // Check for allreadall command, force Gpio mode
  1186. if (strcasecmp (argv [1], "allreadall") == 0)
  1187. {
  1188. wiringPiSetupGpio () ;
  1189. doAllReadall () ;
  1190. return 0 ;
  1191. }
  1192. // Check for -g argument
  1193. /**/ if (strcasecmp (argv [1], "-g") == 0)
  1194. {
  1195. wiringPiSetupGpio () ;
  1196. for (i = 2 ; i < argc ; ++i)
  1197. argv [i - 1] = argv [i] ;
  1198. --argc ;
  1199. wpMode = WPI_MODE_GPIO ;
  1200. }
  1201. // Check for -1 argument
  1202. else if (strcasecmp (argv [1], "-1") == 0)
  1203. {
  1204. wiringPiSetupPhys () ;
  1205. for (i = 2 ; i < argc ; ++i)
  1206. argv [i - 1] = argv [i] ;
  1207. --argc ;
  1208. wpMode = WPI_MODE_PHYS ;
  1209. }
  1210. // Check for -p argument for PiFace
  1211. else if (strcasecmp (argv [1], "-p") == 0)
  1212. {
  1213. piFaceSetup (200) ;
  1214. for (i = 2 ; i < argc ; ++i)
  1215. argv [i - 1] = argv [i] ;
  1216. --argc ;
  1217. wpMode = WPI_MODE_PIFACE ;
  1218. }
  1219. // Check for -z argument so we don't actually initialise wiringPi
  1220. else if (strcasecmp (argv [1], "-z") == 0)
  1221. {
  1222. for (i = 2 ; i < argc ; ++i)
  1223. argv [i - 1] = argv [i] ;
  1224. --argc ;
  1225. wpMode = WPI_MODE_UNINITIALISED ;
  1226. }
  1227. #ifdef CONFIG_CLOCKWORKPI
  1228. else if (strcasecmp (argv [1], "-r") == 0)
  1229. {
  1230. wiringPiSetupRaw();
  1231. for (i = 2 ; i < argc ; ++i)
  1232. argv [i - 1] = argv [i] ;
  1233. --argc ;
  1234. wpMode = WPI_MODE_GPIO ;
  1235. }
  1236. #endif
  1237. // Default to wiringPi mode
  1238. else
  1239. {
  1240. wiringPiSetup () ;
  1241. wpMode = WPI_MODE_PINS ;
  1242. }
  1243. // Check for -x argument to load in a new extension
  1244. // -x extension:base:args
  1245. // Can load many modules, but unless daemon mode we can only send one
  1246. // command at a time.
  1247. while (strcasecmp (argv [1], "-x") == 0)
  1248. {
  1249. if (argc < 3)
  1250. {
  1251. fprintf (stderr, "%s: -x missing extension command.\n", argv [0]) ;
  1252. exit (EXIT_FAILURE) ;
  1253. }
  1254. if (!loadWPiExtension (argv [0], argv [2], TRUE))
  1255. {
  1256. fprintf (stderr, "%s: Extension load failed: %s\n", argv [0], strerror (errno)) ;
  1257. exit (EXIT_FAILURE) ;
  1258. }
  1259. // Shift args down by 2
  1260. for (i = 3 ; i < argc ; ++i)
  1261. argv [i - 2] = argv [i] ;
  1262. argc -= 2 ;
  1263. }
  1264. if (argc <= 1)
  1265. {
  1266. fprintf (stderr, "%s: no command given\n", argv [0]) ;
  1267. exit (EXIT_FAILURE) ;
  1268. }
  1269. #ifdef CONFIG_CLOCKWORKPI
  1270. /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ;
  1271. else if (strcasecmp (argv [1], "moderaw" ) == 0) doModeRaw (argc, argv) ;
  1272. else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ;
  1273. else if (strcasecmp (argv [1], "readraw" ) == 0) doReadRaw (argc, argv) ;
  1274. else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ;
  1275. else if (strcasecmp (argv [1], "writeraw" ) == 0) doWriteRaw (argc, argv) ;
  1276. else if (strcasecmp (argv [1], "readall" ) == 0) CPiReadAll () ;
  1277. else if (strcasecmp (argv [1], "readallraw" ) == 0) CPiReadAllRaw () ;
  1278. #else
  1279. // Core wiringPi functions
  1280. /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ;
  1281. else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ;
  1282. else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ;
  1283. else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ;
  1284. else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ;
  1285. else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ;
  1286. // GPIO Nicies
  1287. else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ;
  1288. else if (strcasecmp (argv [1], "blink" ) == 0) doBlink (argc, argv) ;
  1289. // Pi Specifics
  1290. else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ;
  1291. else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ;
  1292. else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ;
  1293. else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ;
  1294. else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ;
  1295. else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
  1296. else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ;
  1297. else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ;
  1298. else if (strcasecmp (argv [1], "pins" ) == 0) doReadall () ;
  1299. else if (strcasecmp (argv [1], "qmode" ) == 0) doQmode (argc, argv) ;
  1300. else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ;
  1301. else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ;
  1302. else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ;
  1303. else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ;
  1304. else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, TRUE) ;
  1305. else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ;
  1306. else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ;
  1307. else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ;
  1308. #endif
  1309. else
  1310. {
  1311. fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;
  1312. exit (EXIT_FAILURE) ;
  1313. }
  1314. return 0 ;
  1315. }