gpio.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334
  1. /*
  2. * gpio.c:
  3. * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry
  4. * Pi's GPIO.
  5. * Copyright (c) 2012-2013 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 <gertboard.h>
  36. #include <piFace.h>
  37. #include "extensions.h"
  38. extern int wiringPiDebug ;
  39. // External functions I can't be bothered creating a separate .h file for:
  40. extern void doReadall (void) ;
  41. extern void doPins (void) ;
  42. #ifndef TRUE
  43. # define TRUE (1==1)
  44. # define FALSE (1==2)
  45. #endif
  46. #define VERSION "2.20"
  47. #define PI_USB_POWER_CONTROL 38
  48. #define I2CDETECT "/usr/sbin/i2cdetect"
  49. int wpMode ;
  50. char *usage = "Usage: gpio -v\n"
  51. " gpio -h\n"
  52. " gpio [-g|-1] [-x extension:params] ...\n"
  53. " gpio [-p] <read/write/wb> ...\n"
  54. " gpio <read/write/aread/awritewb/pwm/clock/mode> ...\n"
  55. " gpio readall/reset\n"
  56. " gpio unexportall/exports\n"
  57. " gpio export/edge/unexport ...\n"
  58. " gpio wfi <pin> <mode>\n"
  59. " gpio drive <group> <value>\n"
  60. " gpio pwm-bal/pwm-ms \n"
  61. " gpio pwmr <range> \n"
  62. " gpio pwmc <divider> \n"
  63. " gpio load spi/i2c\n"
  64. " gpio i2cd/i2cdetect\n"
  65. " gpio usbp high/low\n"
  66. " gpio gbr <channel>\n"
  67. " gpio gbw <channel> <value>" ; // No trailing newline needed here.
  68. #ifdef NOT_FOR_NOW
  69. /*
  70. * decodePin:
  71. * Decode a pin "number" which can actually be a pin name to represent
  72. * one of the Pi's on-board pins.
  73. *********************************************************************************
  74. */
  75. static int decodePin (const char *str)
  76. {
  77. // The first case - see if it's a number:
  78. if (isdigit (str [0]))
  79. return atoi (str) ;
  80. return 0 ;
  81. }
  82. #endif
  83. /*
  84. * changeOwner:
  85. * Change the ownership of the file to the real userId of the calling
  86. * program so we can access it.
  87. *********************************************************************************
  88. */
  89. static void changeOwner (char *cmd, char *file)
  90. {
  91. uid_t uid = getuid () ;
  92. uid_t gid = getgid () ;
  93. if (chown (file, uid, gid) != 0)
  94. {
  95. if (errno == ENOENT) // Warn that it's not there
  96. fprintf (stderr, "%s: Warning: File not present: %s\n", cmd, file) ;
  97. else
  98. {
  99. fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ;
  100. exit (1) ;
  101. }
  102. }
  103. }
  104. /*
  105. * moduleLoaded:
  106. * Return true/false if the supplied module is loaded
  107. *********************************************************************************
  108. */
  109. static int moduleLoaded (char *modName)
  110. {
  111. int len = strlen (modName) ;
  112. int found = FALSE ;
  113. FILE *fd = fopen ("/proc/modules", "r") ;
  114. char line [80] ;
  115. if (fd == NULL)
  116. {
  117. fprintf (stderr, "gpio: Unable to check modules: %s\n", strerror (errno)) ;
  118. exit (1) ;
  119. }
  120. while (fgets (line, 80, fd) != NULL)
  121. {
  122. if (strncmp (line, modName, len) != 0)
  123. continue ;
  124. found = TRUE ;
  125. break ;
  126. }
  127. fclose (fd) ;
  128. return found ;
  129. }
  130. /*
  131. * doLoad:
  132. * Load either the spi or i2c modules and change device ownerships, etc.
  133. *********************************************************************************
  134. */
  135. static void _doLoadUsage (char *argv [])
  136. {
  137. fprintf (stderr, "Usage: %s load <spi/i2c> [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ;
  138. exit (1) ;
  139. }
  140. static void doLoad (int argc, char *argv [])
  141. {
  142. char *module1, *module2 ;
  143. char cmd [80] ;
  144. char *file1, *file2 ;
  145. char args1 [32], args2 [32] ;
  146. if (argc < 3)
  147. _doLoadUsage (argv) ;
  148. args1 [0] = args2 [0] = 0 ;
  149. /**/ if (strcasecmp (argv [2], "spi") == 0)
  150. {
  151. module1 = "spidev" ;
  152. module2 = "spi_bcm2708" ;
  153. file1 = "/dev/spidev0.0" ;
  154. file2 = "/dev/spidev0.1" ;
  155. if (argc == 4)
  156. sprintf (args1, " bufsiz=%d", atoi (argv [3]) * 1024) ;
  157. else if (argc > 4)
  158. _doLoadUsage (argv) ;
  159. }
  160. else if (strcasecmp (argv [2], "i2c") == 0)
  161. {
  162. module1 = "i2c_dev" ;
  163. module2 = "i2c_bcm2708" ;
  164. file1 = "/dev/i2c-0" ;
  165. file2 = "/dev/i2c-1" ;
  166. if (argc == 4)
  167. sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ;
  168. else if (argc > 4)
  169. _doLoadUsage (argv) ;
  170. }
  171. else
  172. _doLoadUsage (argv) ;
  173. if (!moduleLoaded (module1))
  174. {
  175. sprintf (cmd, "modprobe %s%s", module1, args1) ;
  176. system (cmd) ;
  177. }
  178. if (!moduleLoaded (module2))
  179. {
  180. sprintf (cmd, "modprobe %s%s", module2, args2) ;
  181. system (cmd) ;
  182. }
  183. if (!moduleLoaded (module2))
  184. {
  185. fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ;
  186. exit (1) ;
  187. }
  188. sleep (1) ; // To let things get settled
  189. changeOwner (argv [0], file1) ;
  190. changeOwner (argv [0], file2) ;
  191. }
  192. /*
  193. * doI2Cdetect:
  194. * Run the i2cdetect command with the right runes for this Pi revision
  195. *********************************************************************************
  196. */
  197. static void doI2Cdetect (int argc, char *argv [])
  198. {
  199. int port = piBoardRev () == 1 ? 0 : 1 ;
  200. char command [128] ;
  201. struct stat statBuf ;
  202. if (stat (I2CDETECT, &statBuf) < 0)
  203. {
  204. fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ;
  205. return ;
  206. }
  207. if (!moduleLoaded ("i2c_dev"))
  208. {
  209. fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ;
  210. return ;
  211. }
  212. sprintf (command, "%s -y %d", I2CDETECT, port) ;
  213. if (system (command) < 0)
  214. fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ;
  215. }
  216. /*
  217. * doExports:
  218. * List all GPIO exports
  219. *********************************************************************************
  220. */
  221. static void doExports (int argc, char *argv [])
  222. {
  223. int fd ;
  224. int i, l, first ;
  225. char fName [128] ;
  226. char buf [16] ;
  227. for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective
  228. {
  229. // Try to read the direction
  230. sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ;
  231. if ((fd = open (fName, O_RDONLY)) == -1)
  232. continue ;
  233. if (first == 0)
  234. {
  235. ++first ;
  236. printf ("GPIO Pins exported:\n") ;
  237. }
  238. printf ("%4d: ", i) ;
  239. if ((l = read (fd, buf, 16)) == 0)
  240. sprintf (buf, "%s", "?") ;
  241. buf [l] = 0 ;
  242. if ((buf [strlen (buf) - 1]) == '\n')
  243. buf [strlen (buf) - 1] = 0 ;
  244. printf ("%-3s", buf) ;
  245. close (fd) ;
  246. // Try to Read the value
  247. sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ;
  248. if ((fd = open (fName, O_RDONLY)) == -1)
  249. {
  250. printf ("No Value file (huh?)\n") ;
  251. continue ;
  252. }
  253. if ((l = read (fd, buf, 16)) == 0)
  254. sprintf (buf, "%s", "?") ;
  255. buf [l] = 0 ;
  256. if ((buf [strlen (buf) - 1]) == '\n')
  257. buf [strlen (buf) - 1] = 0 ;
  258. printf (" %s", buf) ;
  259. // Read any edge trigger file
  260. sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ;
  261. if ((fd = open (fName, O_RDONLY)) == -1)
  262. {
  263. printf ("\n") ;
  264. continue ;
  265. }
  266. if ((l = read (fd, buf, 16)) == 0)
  267. sprintf (buf, "%s", "?") ;
  268. buf [l] = 0 ;
  269. if ((buf [strlen (buf) - 1]) == '\n')
  270. buf [strlen (buf) - 1] = 0 ;
  271. printf (" %-8s\n", buf) ;
  272. close (fd) ;
  273. }
  274. }
  275. /*
  276. * doExport:
  277. * gpio export pin mode
  278. * This uses the /sys/class/gpio device interface.
  279. *********************************************************************************
  280. */
  281. void doExport (int argc, char *argv [])
  282. {
  283. FILE *fd ;
  284. int pin ;
  285. char *mode ;
  286. char fName [128] ;
  287. if (argc != 4)
  288. {
  289. fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ;
  290. exit (1) ;
  291. }
  292. pin = atoi (argv [2]) ;
  293. mode = argv [3] ;
  294. if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL)
  295. {
  296. fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
  297. exit (1) ;
  298. }
  299. fprintf (fd, "%d\n", pin) ;
  300. fclose (fd) ;
  301. sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
  302. if ((fd = fopen (fName, "w")) == NULL)
  303. {
  304. fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
  305. exit (1) ;
  306. }
  307. /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0))
  308. fprintf (fd, "in\n") ;
  309. else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0))
  310. fprintf (fd, "out\n") ;
  311. else
  312. {
  313. fprintf (stderr, "%s: Invalid mode: %s. Should be in or out\n", argv [1], mode) ;
  314. exit (1) ;
  315. }
  316. fclose (fd) ;
  317. // Change ownership so the current user can actually use it!
  318. sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
  319. changeOwner (argv [0], fName) ;
  320. sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
  321. changeOwner (argv [0], fName) ;
  322. }
  323. /*
  324. * doWfi:
  325. * gpio wfi pin mode
  326. * Wait for Interrupt on a given pin.
  327. * Slight cheat here - it's easier to actually use ISR now (which calls
  328. * gpio to set the pin modes!) then we simply sleep, and expect the thread
  329. * to exit the program. Crude but effective.
  330. *********************************************************************************
  331. */
  332. static void wfi (void)
  333. { exit (0) ; }
  334. void doWfi (int argc, char *argv [])
  335. {
  336. int pin, mode ;
  337. if (argc != 4)
  338. {
  339. fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ;
  340. exit (1) ;
  341. }
  342. pin = atoi (argv [2]) ;
  343. /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ;
  344. else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ;
  345. else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ;
  346. else
  347. {
  348. fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ;
  349. exit (1) ;
  350. }
  351. if (wiringPiISR (pin, mode, &wfi) < 0)
  352. {
  353. fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ;
  354. exit (1) ;
  355. }
  356. for (;;)
  357. delay (9999) ;
  358. }
  359. /*
  360. * doEdge:
  361. * gpio edge pin mode
  362. * Easy access to changing the edge trigger on a GPIO pin
  363. * This uses the /sys/class/gpio device interface.
  364. *********************************************************************************
  365. */
  366. void doEdge (int argc, char *argv [])
  367. {
  368. FILE *fd ;
  369. int pin ;
  370. char *mode ;
  371. char fName [128] ;
  372. if (argc != 4)
  373. {
  374. fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ;
  375. exit (1) ;
  376. }
  377. pin = atoi (argv [2]) ;
  378. mode = argv [3] ;
  379. // Export the pin and set direction to input
  380. if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL)
  381. {
  382. fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
  383. exit (1) ;
  384. }
  385. fprintf (fd, "%d\n", pin) ;
  386. fclose (fd) ;
  387. sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
  388. if ((fd = fopen (fName, "w")) == NULL)
  389. {
  390. fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
  391. exit (1) ;
  392. }
  393. fprintf (fd, "in\n") ;
  394. fclose (fd) ;
  395. sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
  396. if ((fd = fopen (fName, "w")) == NULL)
  397. {
  398. fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
  399. exit (1) ;
  400. }
  401. /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ;
  402. else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ;
  403. else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ;
  404. else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ;
  405. else
  406. {
  407. fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ;
  408. exit (1) ;
  409. }
  410. // Change ownership of the value and edge files, so the current user can actually use it!
  411. sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
  412. changeOwner (argv [0], fName) ;
  413. sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
  414. changeOwner (argv [0], fName) ;
  415. fclose (fd) ;
  416. }
  417. /*
  418. * doUnexport:
  419. * gpio unexport pin
  420. * This uses the /sys/class/gpio device interface.
  421. *********************************************************************************
  422. */
  423. void doUnexport (int argc, char *argv [])
  424. {
  425. FILE *fd ;
  426. int pin ;
  427. if (argc != 3)
  428. {
  429. fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ;
  430. exit (1) ;
  431. }
  432. pin = atoi (argv [2]) ;
  433. if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
  434. {
  435. fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ;
  436. exit (1) ;
  437. }
  438. fprintf (fd, "%d\n", pin) ;
  439. fclose (fd) ;
  440. }
  441. /*
  442. * doUnexportAll:
  443. * gpio unexportall
  444. * Un-Export all the GPIO pins.
  445. * This uses the /sys/class/gpio device interface.
  446. *********************************************************************************
  447. */
  448. void doUnexportall (char *progName)
  449. {
  450. FILE *fd ;
  451. int pin ;
  452. for (pin = 0 ; pin < 63 ; ++pin)
  453. {
  454. if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
  455. {
  456. fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ;
  457. exit (1) ;
  458. }
  459. fprintf (fd, "%d\n", pin) ;
  460. fclose (fd) ;
  461. }
  462. }
  463. /*
  464. * doResetExternal:
  465. * Load readallExternal, we try to do this with an external device.
  466. *********************************************************************************
  467. */
  468. static void doResetExternal (void)
  469. {
  470. int pin ;
  471. for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin)
  472. {
  473. pinMode (pin, INPUT) ;
  474. pullUpDnControl (pin, PUD_OFF) ;
  475. }
  476. }
  477. /*
  478. * doReset:
  479. * Reset the GPIO pins - as much as we can do
  480. *********************************************************************************
  481. */
  482. static void doReset (char *progName)
  483. {
  484. int pin ;
  485. if (wiringPiNodes != NULL) // External reset
  486. doResetExternal () ;
  487. else
  488. {
  489. doUnexportall (progName) ;
  490. for (pin = 0 ; pin < 64 ; ++pin)
  491. {
  492. if (wpiPinToGpio (pin) == -1)
  493. continue ;
  494. digitalWrite (pin, LOW) ;
  495. pinMode (pin, INPUT) ;
  496. pullUpDnControl (pin, PUD_OFF) ;
  497. }
  498. }
  499. }
  500. /*
  501. * doMode:
  502. * gpio mode pin mode ...
  503. *********************************************************************************
  504. */
  505. void doMode (int argc, char *argv [])
  506. {
  507. int pin ;
  508. char *mode ;
  509. if (argc != 4)
  510. {
  511. fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ;
  512. exit (1) ;
  513. }
  514. pin = atoi (argv [2]) ;
  515. mode = argv [3] ;
  516. /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ;
  517. else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ;
  518. else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ;
  519. else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ;
  520. else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ;
  521. else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ;
  522. else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ;
  523. else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ;
  524. else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ;
  525. else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ;
  526. else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ;
  527. // Undocumented
  528. else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ;
  529. else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ;
  530. else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ;
  531. else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ;
  532. else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ;
  533. else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ;
  534. else
  535. {
  536. fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
  537. exit (1) ;
  538. }
  539. }
  540. /*
  541. * doPadDrive:
  542. * gpio drive group value
  543. *********************************************************************************
  544. */
  545. static void doPadDrive (int argc, char *argv [])
  546. {
  547. int group, val ;
  548. if (argc != 4)
  549. {
  550. fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ;
  551. exit (1) ;
  552. }
  553. group = atoi (argv [2]) ;
  554. val = atoi (argv [3]) ;
  555. if ((group < 0) || (group > 2))
  556. {
  557. fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ;
  558. exit (1) ;
  559. }
  560. if ((val < 0) || (val > 7))
  561. {
  562. fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ;
  563. exit (1) ;
  564. }
  565. setPadDrive (group, val) ;
  566. }
  567. /*
  568. * doUsbP:
  569. * Control USB Power - High (1.2A) or Low (600mA)
  570. * gpio usbp high/low
  571. *********************************************************************************
  572. */
  573. static void doUsbP (int argc, char *argv [])
  574. {
  575. int model, rev, mem, maker, overVolted ;
  576. if (argc != 3)
  577. {
  578. fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
  579. exit (1) ;
  580. }
  581. // Make sure we're on a B+
  582. piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
  583. if (model != PI_MODEL_BP)
  584. {
  585. fprintf (stderr, "USB power contol is applicable to B+ boards only.\n") ;
  586. exit (1) ;
  587. }
  588. // Need to force BCM_GPIO mode:
  589. wiringPiSetupGpio () ;
  590. if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0))
  591. {
  592. digitalWrite (PI_USB_POWER_CONTROL, 1) ;
  593. pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
  594. printf ("Switched to HIGH current USB (1.2A)\n") ;
  595. return ;
  596. }
  597. if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0))
  598. {
  599. digitalWrite (PI_USB_POWER_CONTROL, 0) ;
  600. pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
  601. printf ("Switched to LOW current USB (600mA)\n") ;
  602. return ;
  603. }
  604. fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
  605. exit (1) ;
  606. }
  607. /*
  608. * doGbw:
  609. * gpio gbw channel value
  610. * Gertboard Write - To the Analog output
  611. *********************************************************************************
  612. */
  613. static void doGbw (int argc, char *argv [])
  614. {
  615. int channel, value ;
  616. if (argc != 4)
  617. {
  618. fprintf (stderr, "Usage: %s gbw <channel> <value>\n", argv [0]) ;
  619. exit (1) ;
  620. }
  621. channel = atoi (argv [2]) ;
  622. value = atoi (argv [3]) ;
  623. if ((channel < 0) || (channel > 1))
  624. {
  625. fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ;
  626. exit (1) ;
  627. }
  628. if ((value < 0) || (value > 255))
  629. {
  630. fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ;
  631. exit (1) ;
  632. }
  633. if (gertboardAnalogSetup (64) < 0)
  634. {
  635. fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
  636. exit (1) ;
  637. }
  638. analogWrite (64 + channel, value) ;
  639. }
  640. /*
  641. * doGbr:
  642. * gpio gbr channel
  643. * From the analog input
  644. *********************************************************************************
  645. */
  646. static void doGbr (int argc, char *argv [])
  647. {
  648. int channel ;
  649. if (argc != 3)
  650. {
  651. fprintf (stderr, "Usage: %s gbr <channel>\n", argv [0]) ;
  652. exit (1) ;
  653. }
  654. channel = atoi (argv [2]) ;
  655. if ((channel < 0) || (channel > 1))
  656. {
  657. fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ;
  658. exit (1) ;
  659. }
  660. if (gertboardAnalogSetup (64) < 0)
  661. {
  662. fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
  663. exit (1) ;
  664. }
  665. printf ("%d\n", analogRead (64 + channel)) ;
  666. }
  667. /*
  668. * doWrite:
  669. * gpio write pin value
  670. *********************************************************************************
  671. */
  672. static void doWrite (int argc, char *argv [])
  673. {
  674. int pin, val ;
  675. if (argc != 4)
  676. {
  677. fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ;
  678. exit (1) ;
  679. }
  680. pin = atoi (argv [2]) ;
  681. /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0))
  682. val = 1 ;
  683. else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0))
  684. val = 0 ;
  685. else
  686. val = atoi (argv [3]) ;
  687. /**/ if (val == 0)
  688. digitalWrite (pin, LOW) ;
  689. else
  690. digitalWrite (pin, HIGH) ;
  691. }
  692. /*
  693. * doAwriterite:
  694. * gpio awrite pin value
  695. *********************************************************************************
  696. */
  697. static void doAwrite (int argc, char *argv [])
  698. {
  699. int pin, val ;
  700. if (argc != 4)
  701. {
  702. fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ;
  703. exit (1) ;
  704. }
  705. pin = atoi (argv [2]) ;
  706. val = atoi (argv [3]) ;
  707. analogWrite (pin, val) ;
  708. }
  709. /*
  710. * doWriteByte:
  711. * gpio write value
  712. *********************************************************************************
  713. */
  714. static void doWriteByte (int argc, char *argv [])
  715. {
  716. int val ;
  717. if (argc != 3)
  718. {
  719. fprintf (stderr, "Usage: %s wb value\n", argv [0]) ;
  720. exit (1) ;
  721. }
  722. val = (int)strtol (argv [2], NULL, 0) ;
  723. digitalWriteByte (val) ;
  724. }
  725. /*
  726. * doRead:
  727. * Read a pin and return the value
  728. *********************************************************************************
  729. */
  730. void doRead (int argc, char *argv [])
  731. {
  732. int pin, val ;
  733. if (argc != 3)
  734. {
  735. fprintf (stderr, "Usage: %s read pin\n", argv [0]) ;
  736. exit (1) ;
  737. }
  738. pin = atoi (argv [2]) ;
  739. val = digitalRead (pin) ;
  740. printf ("%s\n", val == 0 ? "0" : "1") ;
  741. }
  742. /*
  743. * doAread:
  744. * Read an analog pin and return the value
  745. *********************************************************************************
  746. */
  747. void doAread (int argc, char *argv [])
  748. {
  749. if (argc != 3)
  750. {
  751. fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ;
  752. exit (1) ;
  753. }
  754. printf ("%d\n", analogRead (atoi (argv [2]))) ;
  755. }
  756. /*
  757. * doToggle:
  758. * Toggle an IO pin
  759. *********************************************************************************
  760. */
  761. void doToggle (int argc, char *argv [])
  762. {
  763. int pin ;
  764. if (argc != 3)
  765. {
  766. fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ;
  767. exit (1) ;
  768. }
  769. pin = atoi (argv [2]) ;
  770. digitalWrite (pin, !digitalRead (pin)) ;
  771. }
  772. /*
  773. * doPwmTone:
  774. * Output a tone in a PWM pin
  775. *********************************************************************************
  776. */
  777. void doPwmTone (int argc, char *argv [])
  778. {
  779. int pin, freq ;
  780. if (argc != 4)
  781. {
  782. fprintf (stderr, "Usage: %s pwmTone <pin> <freq>\n", argv [0]) ;
  783. exit (1) ;
  784. }
  785. pin = atoi (argv [2]) ;
  786. freq = atoi (argv [3]) ;
  787. pwmToneWrite (pin, freq) ;
  788. }
  789. /*
  790. * doClock:
  791. * Output a clock on a pin
  792. *********************************************************************************
  793. */
  794. void doClock (int argc, char *argv [])
  795. {
  796. int pin, freq ;
  797. if (argc != 4)
  798. {
  799. fprintf (stderr, "Usage: %s clock <pin> <freq>\n", argv [0]) ;
  800. exit (1) ;
  801. }
  802. pin = atoi (argv [2]) ;
  803. freq = atoi (argv [3]) ;
  804. gpioClockSet (pin, freq) ;
  805. }
  806. /*
  807. * doPwm:
  808. * Output a PWM value on a pin
  809. *********************************************************************************
  810. */
  811. void doPwm (int argc, char *argv [])
  812. {
  813. int pin, val ;
  814. if (argc != 4)
  815. {
  816. fprintf (stderr, "Usage: %s pwm <pin> <value>\n", argv [0]) ;
  817. exit (1) ;
  818. }
  819. pin = atoi (argv [2]) ;
  820. val = atoi (argv [3]) ;
  821. pwmWrite (pin, val) ;
  822. }
  823. /*
  824. * doPwmMode: doPwmRange: doPwmClock:
  825. * Change the PWM mode, range and clock divider values
  826. *********************************************************************************
  827. */
  828. static void doPwmMode (int mode)
  829. {
  830. pwmSetMode (mode) ;
  831. }
  832. static void doPwmRange (int argc, char *argv [])
  833. {
  834. unsigned int range ;
  835. if (argc != 3)
  836. {
  837. fprintf (stderr, "Usage: %s pwmr <range>\n", argv [0]) ;
  838. exit (1) ;
  839. }
  840. range = (unsigned int)strtoul (argv [2], NULL, 10) ;
  841. if (range == 0)
  842. {
  843. fprintf (stderr, "%s: range must be > 0\n", argv [0]) ;
  844. exit (1) ;
  845. }
  846. pwmSetRange (range) ;
  847. }
  848. static void doPwmClock (int argc, char *argv [])
  849. {
  850. unsigned int clock ;
  851. if (argc != 3)
  852. {
  853. fprintf (stderr, "Usage: %s pwmc <clock>\n", argv [0]) ;
  854. exit (1) ;
  855. }
  856. clock = (unsigned int)strtoul (argv [2], NULL, 10) ;
  857. if ((clock < 1) || (clock > 4095))
  858. {
  859. fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ;
  860. exit (1) ;
  861. }
  862. pwmSetClock (clock) ;
  863. }
  864. /*
  865. * main:
  866. * Start here
  867. *********************************************************************************
  868. */
  869. int main (int argc, char *argv [])
  870. {
  871. int i ;
  872. int model, rev, mem, maker, overVolted ;
  873. if (getenv ("WIRINGPI_DEBUG") != NULL)
  874. {
  875. printf ("gpio: wiringPi debug mode enabled\n") ;
  876. wiringPiDebug = TRUE ;
  877. }
  878. if (argc == 1)
  879. {
  880. fprintf (stderr, "%s\n", usage) ;
  881. return 1 ;
  882. }
  883. // Help
  884. if (strcasecmp (argv [1], "-h") == 0)
  885. {
  886. printf ("%s: %s\n", argv [0], usage) ;
  887. return 0 ;
  888. }
  889. // Sort of a special:
  890. if (strcmp (argv [1], "-R") == 0)
  891. {
  892. printf ("%d\n", piBoardRev ()) ;
  893. return 0 ;
  894. }
  895. // Version & Warranty
  896. if (strcmp (argv [1], "-V") == 0)
  897. {
  898. printf ("%d\n", piBoardRev ()) ;
  899. return 0 ;
  900. }
  901. if (strcmp (argv [1], "-v") == 0)
  902. {
  903. printf ("gpio version: %s\n", VERSION) ;
  904. printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ;
  905. printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
  906. printf ("For details type: %s -warranty\n", argv [0]) ;
  907. printf ("\n") ;
  908. piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
  909. if (model == PI_MODEL_UNKNOWN)
  910. {
  911. printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ;
  912. printf (" projects@drogon.net\n") ;
  913. printf ("with a copy of your /proc/cpuinfo if possible\n") ;
  914. }
  915. else
  916. {
  917. printf ("Raspberry Pi Details:\n") ;
  918. printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n",
  919. piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ;
  920. }
  921. return 0 ;
  922. }
  923. if (strcasecmp (argv [1], "-warranty") == 0)
  924. {
  925. printf ("gpio version: %s\n", VERSION) ;
  926. printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ;
  927. printf ("\n") ;
  928. printf (" This program is free software; you can redistribute it and/or modify\n") ;
  929. printf (" it under the terms of the GNU Leser General Public License as published\n") ;
  930. printf (" by the Free Software Foundation, either version 3 of the License, or\n") ;
  931. printf (" (at your option) any later version.\n") ;
  932. printf ("\n") ;
  933. printf (" This program is distributed in the hope that it will be useful,\n") ;
  934. printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ;
  935. printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ;
  936. printf (" GNU Lesser General Public License for more details.\n") ;
  937. printf ("\n") ;
  938. printf (" You should have received a copy of the GNU Lesser General Public License\n") ;
  939. printf (" along with this program. If not, see <http://www.gnu.org/licenses/>.\n") ;
  940. printf ("\n") ;
  941. return 0 ;
  942. }
  943. if (geteuid () != 0)
  944. {
  945. fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ;
  946. return 1 ;
  947. }
  948. // Initial test for /sys/class/gpio operations:
  949. /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; }
  950. else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; }
  951. else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; }
  952. else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; }
  953. else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; }
  954. // Check for load command:
  955. if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; }
  956. // Gertboard commands
  957. if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; }
  958. if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; }
  959. // Check for -g argument
  960. /**/ if (strcasecmp (argv [1], "-g") == 0)
  961. {
  962. wiringPiSetupGpio () ;
  963. for (i = 2 ; i < argc ; ++i)
  964. argv [i - 1] = argv [i] ;
  965. --argc ;
  966. wpMode = WPI_MODE_GPIO ;
  967. }
  968. // Check for -1 argument
  969. else if (strcasecmp (argv [1], "-1") == 0)
  970. {
  971. wiringPiSetupPhys () ;
  972. for (i = 2 ; i < argc ; ++i)
  973. argv [i - 1] = argv [i] ;
  974. --argc ;
  975. wpMode = WPI_MODE_PHYS ;
  976. }
  977. // Check for -p argument for PiFace
  978. else if (strcasecmp (argv [1], "-p") == 0)
  979. {
  980. piFaceSetup (200) ;
  981. for (i = 2 ; i < argc ; ++i)
  982. argv [i - 1] = argv [i] ;
  983. --argc ;
  984. wpMode = WPI_MODE_PIFACE ;
  985. }
  986. // Default to wiringPi mode
  987. else
  988. {
  989. wiringPiSetup () ;
  990. wpMode = WPI_MODE_PINS ;
  991. }
  992. // Check for -x argument to load in a new extension
  993. if (strcasecmp (argv [1], "-x") == 0)
  994. {
  995. if (argc < 3)
  996. {
  997. fprintf (stderr, "%s: -x missing extension specification.\n", argv [0]) ;
  998. exit (EXIT_FAILURE) ;
  999. }
  1000. if (!doExtension (argv [0], argv [2])) // Prints its own error messages
  1001. exit (EXIT_FAILURE) ;
  1002. for (i = 3 ; i < argc ; ++i)
  1003. argv [i - 2] = argv [i] ;
  1004. argc -= 2 ;
  1005. }
  1006. if (argc <= 1)
  1007. {
  1008. fprintf (stderr, "%s: no command given\n", argv [0]) ;
  1009. exit (EXIT_FAILURE) ;
  1010. }
  1011. // Core wiringPi functions
  1012. /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ;
  1013. else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ;
  1014. else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ;
  1015. else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ;
  1016. else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ;
  1017. else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ;
  1018. // GPIO Nicies
  1019. else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ;
  1020. // Pi Specifics
  1021. else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ;
  1022. else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ;
  1023. else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ;
  1024. else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ;
  1025. else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ;
  1026. else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
  1027. else if (strcasecmp (argv [1], "usbp" ) == 0) doUsbP (argc, argv) ;
  1028. else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ;
  1029. else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ;
  1030. else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ;
  1031. else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ;
  1032. else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ;
  1033. else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ;
  1034. else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ;
  1035. else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ;
  1036. else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ;
  1037. else
  1038. {
  1039. fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;
  1040. exit (EXIT_FAILURE) ;
  1041. }
  1042. return 0 ;
  1043. }