From 3b38a5fc96b2f0879889d662458f7b7aca21d490 Mon Sep 17 00:00:00 2001 From: Joshua Yang Date: Wed, 28 Nov 2018 16:54:34 +0900 Subject: [PATCH] wiringPi: Refactor source codes Change-Id: Id121bfc6cb211b78b7ade56d235d43bdf11fc690 --- .gitignore | 2 + debian-template/wiringPi/DEBIAN/control | 10 - debian-template/wiringPi/DEBIAN/postinst | 5 - debian-template/wiringPi/DEBIAN/postrm | 2 - gpio/gpio_odroid.c | 57 +- gpio/readall_odroid.c | 9 +- pins/odroid_c1.aux | 1 + pins/odroid_c1.dvi | Bin 0 -> 8888 bytes pins/odroid_c1.log | 101 + pins/odroid_c1.pdf | Bin 0 -> 17510 bytes pins/odroid_c2.aux | 1 + pins/odroid_c2.dvi | Bin 0 -> 8896 bytes pins/odroid_c2.log | 101 + pins/odroid_c2.pdf | Bin 0 -> 17411 bytes pins/odroid_n1.aux | 1 + pins/odroid_n1.dvi | Bin 0 -> 9328 bytes pins/odroid_n1.log | 101 + pins/odroid_n1.pdf | Bin 0 -> 17832 bytes pins/odroid_xu3.aux | 1 + pins/odroid_xu3.dvi | Bin 0 -> 8792 bytes pins/odroid_xu3.log | 102 + pins/odroid_xu3.pdf | Bin 0 -> 18219 bytes pins/pins.aux | 1 + pins/pins.dvi | Bin 0 -> 8420 bytes pins/pins.log | 107 + wiringPi/Makefile | 6 +- wiringPi/wiringOdroid.c | 20 +- wiringPi/wiringOdroid.h | 67 +- wiringPi/{wiringPiI2C.c => wiringOdroidI2C.c} | 22 - wiringPi/wiringOdroidI2C.h | 42 + wiringPi/{wiringPiSPI.c => wiringOdroidSPI.c} | 49 +- wiringPi/wiringOdroidSPI.h | 36 + wiringPi/wiringPi.c | 2373 ----------------- wiringPi/wiringPi.h | 255 +- wiringPi/wiringPiI2C.h | 43 +- wiringPi/wiringPiSPI.h | 37 +- wiringPi/wpiExtensions.c | 21 - 37 files changed, 694 insertions(+), 2879 deletions(-) delete mode 100644 debian-template/wiringPi/DEBIAN/control delete mode 100644 debian-template/wiringPi/DEBIAN/postinst delete mode 100644 debian-template/wiringPi/DEBIAN/postrm create mode 100644 pins/odroid_c1.aux create mode 100644 pins/odroid_c1.dvi create mode 100644 pins/odroid_c1.log create mode 100644 pins/odroid_c1.pdf create mode 100644 pins/odroid_c2.aux create mode 100644 pins/odroid_c2.dvi create mode 100644 pins/odroid_c2.log create mode 100644 pins/odroid_c2.pdf create mode 100644 pins/odroid_n1.aux create mode 100644 pins/odroid_n1.dvi create mode 100644 pins/odroid_n1.log create mode 100644 pins/odroid_n1.pdf create mode 100644 pins/odroid_xu3.aux create mode 100644 pins/odroid_xu3.dvi create mode 100644 pins/odroid_xu3.log create mode 100644 pins/odroid_xu3.pdf create mode 100644 pins/pins.aux create mode 100644 pins/pins.dvi create mode 100644 pins/pins.log rename wiringPi/{wiringPiI2C.c => wiringOdroidI2C.c} (95%) mode change 100755 => 100644 create mode 100644 wiringPi/wiringOdroidI2C.h rename wiringPi/{wiringPiSPI.c => wiringOdroidSPI.c} (76%) mode change 100755 => 100644 create mode 100644 wiringPi/wiringOdroidSPI.h delete mode 100644 wiringPi/wiringPi.c mode change 100644 => 120000 wiringPi/wiringPi.h mode change 100644 => 120000 wiringPi/wiringPiI2C.h mode change 100644 => 120000 wiringPi/wiringPiSPI.h diff --git a/.gitignore b/.gitignore index ed2ec80..7163f9a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ lib*.so.* debian-template/wiringPi debian-template/wiringpi-*.deb gpio/gpio +.DS_Store +.vscode \ No newline at end of file diff --git a/debian-template/wiringPi/DEBIAN/control b/debian-template/wiringPi/DEBIAN/control deleted file mode 100644 index ad7d0e1..0000000 --- a/debian-template/wiringPi/DEBIAN/control +++ /dev/null @@ -1,10 +0,0 @@ -Package: wiringpi -Version: 2.44 -Section: libraries -Priority: optional -Architecture: armhf -Depends: libc6 -Maintainer: Gordon Henderson -Description: The wiringPi libraries, headers and gpio command - Libraries to allow GPIO access on a Raspberry Pi from C and C++ - and BASIC programs as well as from the command-line diff --git a/debian-template/wiringPi/DEBIAN/postinst b/debian-template/wiringPi/DEBIAN/postinst deleted file mode 100644 index 4997e98..0000000 --- a/debian-template/wiringPi/DEBIAN/postinst +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -set -e -/bin/chown root.root /usr/bin/gpio -/bin/chmod 4755 /usr/bin/gpio -/sbin/ldconfig diff --git a/debian-template/wiringPi/DEBIAN/postrm b/debian-template/wiringPi/DEBIAN/postrm deleted file mode 100644 index 4be8c58..0000000 --- a/debian-template/wiringPi/DEBIAN/postrm +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -/sbin/ldconfig diff --git a/gpio/gpio_odroid.c b/gpio/gpio_odroid.c index 25ad650..8e38f3c 100755 --- a/gpio/gpio_odroid.c +++ b/gpio/gpio_odroid.c @@ -33,7 +33,6 @@ #include #include -#include #include #include @@ -625,52 +624,6 @@ static void doPadDrive (int argc, char *argv []) } -/* - * doUsbP: - * Control USB Power - High (1.2A) or Low (600mA) - * gpio usbp high/low - ********************************************************************************* - */ - -static void doUsbP (int argc, char *argv []) -{ - int model, rev, mem, maker, overVolted ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; - exit (1) ; - } - - // Make sure we're on a B+ - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - - if (!((model == PI_MODEL_BP) || (model == PI_MODEL_2))) { - fprintf (stderr, "USB power contol is applicable to B+ and v2 boards only.\n") ; - exit (1) ; - } - - // Make sure we start in BCM_GPIO mode - wiringPiSetupGpio () ; - - if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0)) { - digitalWrite (PI_USB_POWER_CONTROL, 1) ; - pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; - printf ("Switched to HIGH current USB (1.2A)\n") ; - return ; - } - - if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0)) { - digitalWrite (PI_USB_POWER_CONTROL, 0) ; - pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; - printf ("Switched to LOW current USB (600mA)\n") ; - return ; - } - - fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; - exit (1) ; -} - - /* * doGbw: * gpio gbw channel value @@ -1189,29 +1142,29 @@ int main (int argc, char *argv []) for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; - wpMode = WPI_MODE_GPIO ; + wpMode = MODE_GPIO ; } else if (strcasecmp (argv [1], "-1") == 0) { // Check for -1 argument wiringPiSetupPhys () ; for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; - wpMode = WPI_MODE_PHYS ; + wpMode = MODE_PHYS ; } else if (strcasecmp (argv [1], "-p") == 0) { // Check for -p argument for PiFace piFaceSetup (200) ; for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; - wpMode = WPI_MODE_PIFACE ; + wpMode = MODE_PIFACE ; } else if (strcasecmp (argv [1], "-z") == 0) { // Check for -z argument so we don't actually initialise wiringPi for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; - wpMode = WPI_MODE_UNINITIALISED ; + wpMode = MODE_UNINITIALISED ; } else { // Default to wiringPi mode wiringPiSetup () ; - wpMode = WPI_MODE_PINS ; + wpMode = MODE_PINS ; } // Check for -x argument to load in a new extension diff --git a/gpio/readall_odroid.c b/gpio/readall_odroid.c index 55a010e..0545a62 100755 --- a/gpio/readall_odroid.c +++ b/gpio/readall_odroid.c @@ -33,7 +33,6 @@ #include /*----------------------------------------------------------------------------*/ -#include extern int wpMode ; @@ -277,9 +276,9 @@ static void readallPhysOdroid (int model, int rev, int physPin, const char *phys if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) printf (" | | ") ; else { - if (wpMode == WPI_MODE_GPIO) + if (wpMode == MODE_GPIO) pin = physPinToGpio (physPin); - else if (wpMode == WPI_MODE_PHYS) + else if (wpMode == MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin]; @@ -297,9 +296,9 @@ static void readallPhysOdroid (int model, int rev, int physPin, const char *phys if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) printf (" | | ") ; else { - if (wpMode == WPI_MODE_GPIO) + if (wpMode == MODE_GPIO) pin = physPinToGpio (physPin); - else if (wpMode == WPI_MODE_PHYS) + else if (wpMode == MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin]; diff --git a/pins/odroid_c1.aux b/pins/odroid_c1.aux new file mode 100644 index 0000000..f23e546 --- /dev/null +++ b/pins/odroid_c1.aux @@ -0,0 +1 @@ +\relax diff --git a/pins/odroid_c1.dvi b/pins/odroid_c1.dvi new file mode 100644 index 0000000000000000000000000000000000000000..f25a8cbbc463985f7f7b8825f7aa364de21a7125 GIT binary patch literal 8888 zcmeI2du$X%9LM)sAhxBY6%rGudJu>OWN&Bpo<$&VHBhCGv`q^kKCahmd(!sK>-7;t zjUtJPx7=Q}rp0*I*g&+__##H@A4W-tK!YSE)o3M(F(`zZv{9&$IPpYB&3Xv9!!f@eImp(PXwNlzRuB%Fqw z5n-NTzaG#1%HybJGRFlb6UIKz-`HMj3l7zI1KyT~a&MuOeq_Vu^5U}Y^ekt&x23DJ zt-02Nj&)T@Q+I#istupH)Z}RuquD*ZA*pd*$9Uf9-|p*7UC`Ye3*5to*r~WdTRHa=wIjd43!mCgpZDw6&I~> zawaE$Kda@Qnz=+jQJ=fqzLpk`JLn4(JixDnC#Ux%FC~g^&e?S)dB12H!zBOd)84sz z?ulV^=kW!LhMLAxbRh14E%*t<9bPq8CN9N6D{d8%s*8Uvbp^fc;g8RGPy-a5lv5In zDtjkFVuJI#c6o|)UdYC5`u*FNIaN?N+682l{VLoU_ItF8B4Yym_T|)Q}Db4-k3-LCdt^ugaqE{$Dl%CF`uGPhp{|5XD&w zx~$E&AZv$~wS~yqLT3F=-m)23JGbJX&(u(Ww&;SkUIS>weB*AUsBJjts?l9`Aqg63 zdb@PF<7HM@Db4>e6C;Fj$H3gvWXy?Kil&B5Dd^k2S%h7MENGi9XFC;V_GFVLw!}=6 zGe}iukutIc`(D8!L)l~7@m~Q@@~AnvjRjVyxr>`LjgLh~fknEr_j~+^Cb?jTsZ#Xe z$(@?6B(k&I6@AH&89Q_t1C9=|@U12?3~~hyIp_B@toupGsZ1(O$&hW+L$*>t#*I9l z!8xti?F6yguR-jbQc@IRKWl6N`c?_(ys}`)dCf?~HFCu;(Nx4zo;o@-7LR=RuH8mJ z0!M=|{|&M#;nn09X~bmQ~;&s(>!<@Us{SeJ2IiVx|98h8GB& zQ(hXMZBX)rlt#x{m<4BjBL#F$N+o%-UUW$EJ4QIbsnZYCdq(<;xU6AYsCP4k-m&wj zGW@?$grn4=Z=`_ENvSwns5tYg2@cD*X*gRbIAcj3n!+e5(*cj{A+=aTr8>+loHDJ+ zxrHNZe(*@PZX&gmlvNfhJDb(*#0MN-SE3pn4TZkn@^pSnUJ>2s)RIIkXi%3=O#)7x z#$gsGj50Gb>Eg<=t0&Ft`ze1N{nV_n80TuEb z;)!48rYz)PX5sbCl&3RO3d&gZI4xymMUC<-4~ThIrVJ=36O+6kj}M;Y;eJdi@hJCW z(0Wb1i$=d6gO!mK`!Q%l^lg`?v)$GAn8>EG-o@ zEW)gZg_qC7hDA06pt60qLq@Ug}G9DG|9HHE_GuX<+z z<}bPEf)w^Q)PPNdpZxc>Xb&`Sk$V+LBBWX>>>(IqZc#Mh_ zorwq4+NZPl*4qD1q%%eMiQW-8NcVomOBdnm6|0o*lb}~T&}$q_24f(wkgZvJ` NC5Bm6l6G4D`~xc1Z@B;f literal 0 HcmV?d00001 diff --git a/pins/odroid_c1.log b/pins/odroid_c1.log new file mode 100644 index 0000000..79a3615 --- /dev/null +++ b/pins/odroid_c1.log @@ -0,0 +1,101 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=latex 2018.1.11) 11 JAN 2018 17:00 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**odroid_c1.tex odroid_c1.dvi +(./odroid_c1.tex +LaTeX2e <2017-04-15> +Babel <3.12> and hyphenation patterns for 3 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: dvips.def on input line 99. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/dvips.def +File: dvips.def 2017/06/20 v3.1d Graphics/color driver for dvips +)) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +Package: color 2016/07/10 v1.1e Standard LaTeX Color (DPC) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package color Info: Driver file: dvips.def on input line 147. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/dvipsnam.def +File: dvipsnam.def 2016/06/17 v3.0m Driver-dependent file (DPC,SPQR) +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2005/04/12 PSNFSS-v9.2a (WaS) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) (./odroid_c1.aux) +\openout1 = `odroid_c1.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Try loading font information for OT1+phv on input line 19. + (/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1phv.fd +File: ot1phv.fd 2001/06/04 scalable font definitions for OT1/phv. +) +LaTeX Font Info: Font shape `OT1/phv/bx/n' in size <10.95> not available +(Font) Font shape `OT1/phv/b/n' tried instead on input line 39. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 44. + +Overfull \hbox (45.36154pt too wide) in paragraph at lines 44--96 + [] + [] + +[1 + +] (./odroid_c1.aux) ) +Here is how much of TeX's memory you used: + 770 strings out of 494932 + 10317 string characters out of 6180877 + 70176 words of memory out of 5000000 + 4123 multiletter control sequences out of 15000+600000 + 7689 words of font info for 26 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 23i,8n,19p,198b,201s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on odroid_c1.dvi (1 page, 8888 bytes). diff --git a/pins/odroid_c1.pdf b/pins/odroid_c1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a930f9590b9c1f1e2e172a082767f18793b8ec44 GIT binary patch literal 17510 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 C`e9c9 literal 0 HcmV?d00001 diff --git a/pins/odroid_c2.aux b/pins/odroid_c2.aux new file mode 100644 index 0000000..f23e546 --- /dev/null +++ b/pins/odroid_c2.aux @@ -0,0 +1 @@ +\relax diff --git a/pins/odroid_c2.dvi b/pins/odroid_c2.dvi new file mode 100644 index 0000000000000000000000000000000000000000..9d9ccd64c32cd8fcc17ae9cd2654490b278609ef GIT binary patch literal 8896 zcmeI2e{2**6vy|j6l^QdYNLNx^dKq)VY@TC_p7y5dNo*twxOlKACg?J2R&(fm+Q49 zpizS)D%^Q{#fB1+D+z%pi3y?sEdhf~P$>S23KAly^WMDgo7w%#XjmWlprC|9N5)V0nd;ojOy2f@uRUOb0kEZ?jc*S2p*x-~YYhg2^1646DYp@K zM7S6EFJrl%x$X5_c1+~5k?j+GO&tx^K;Kf2-_yFP##1b3^q0-AsjTkK$Z^zoTDz*+ zTN>Q>Tvweu{J@9KhVa=-&F;2PbaKzupxiXEGnRMy=SSBhALwcc1b}d$DG>0r6&DqC zdRBXQZ=>JqY2;nrmZFh=&UL|}Ca1r#)9H5?g`)S@yo`K^aNj+&V>~B9z1*&$3+U?J z;pH9vS2%9vN+b7C;f|~g1;Jo=;P{RS`Om$?P44NzXSQ)$KKUYg<=pzd>WanTBeCkr zin$J`_$Uc+53#phE^lkA+ZFKo3m3pyTec^j5DL99VeQ$(Fi|7NCH}KLb-?b-f#Z0* z*wp;K=2#L6qU^T@-ba+fvojUY@+e=`P(gY5k~vk*fTtt;-Z?kE0GlS~E$fS_oeCjP zd&@GboGorS`|@t$oNVaXnzS8VIM{NSAkv+?Z8|paNw>4n?e9vCuD#PBEV+w11RCD( zO!@Cjb{Y;|J(udUj3E&og?1*OQV0{*%JUme5FYLtj1d=LJo{eA8!AxEA^)ld6W|4t zNf`Yj@?wW-Zpc$h_7M-!(7?HQVbKN<3PlW@aE7=vgfrJLu`wUwvokJm#97UQA_n`+ zNhziYyg6x_nK10`fnMTynEw7_`?bFrxy^r&zp0SY^3=5RL7WCQRR)BD@}iGRpKmi1ZjDA z>8Hzh2xiGy8Ltw2aP8Pr&`O6KpQU(aSk?J_$H{!+DfE1{>Qc5bQI@{Hl44tYqA3-m zZcT;SvZ)(iCoIF&!};qWCDK5lmrV@Q1_i~CW@#?I& zqMtBy#&%uCKwyKspee;N0`g)K@|537|KnqzM8?uD~GAZPv6Y-{ojNdE zstf9bVo3G#mOp{MPy#lka^x}0(-Y7-vi`<+wBCWE=Oi)moiS5Uwv zp-lNM=~;*Kz46i{C?>m#5v{XPdEj)H7}A}X4NS%T-{`+_UD4N2z$T(hoXt#}MNM5n zeH$h3FlRFZXQI9%Js89tI)GRilIt|or7J0)?9xX%2 zR9D%Oqs!&1ott@p3P9FZhe@7DdGT5aFp#E}c~OZGQRbD+m}F<8-i)!(_Xij^V~9qQ zVKWAYMPGR#oAQFvgY?{wFR#$VB#qPTU*P0lvCjyFWJ9mUf;2E?YjGqnV%mX$%AG`D zu>QiN1ta>4Rur^a^j6-(beGk;36MxetqYW;E{=%40*kk!0z*o#Gq@H4b*YQbLfq1x z$<|Inj*T~wWNf@eeH|9rboh~(B11Y5Laa3p&jF=2NvggiP6gmC26}CR*Sy7mYMIi4 z!Z8{nwE=iX4OOM|rvS0+()vuF0;0Yki)?~?Yc-*e()!>jpk^HpHtxLAo&v-|l99K* zHj8Z9%r*sx4OXprcnY|Wl|i5`!f`5iA(To5t24BwtInto&@RGOoR~4M!V%v63qP;2 z3dr}IdOOWpM65Kmo{o|D`f4n)sWDq1Z0bf?YaR}SM`{PWtscKkUF=@jRoxzta~C|W zg`x1bG4LmDWZG=F@jJ;#UPXO*mDuE!4Y7SZ#NPfNles3)a!tW&*TqYDu}XBJ@mJTW z?`z2oxBuT!7lzOgy*ILx?L&=C7twbXv(+D#;BP(f_Z(anXP|#RLH|mF{#C&xj+;?$ IJdKZk06>XKvj6}9 literal 0 HcmV?d00001 diff --git a/pins/odroid_c2.log b/pins/odroid_c2.log new file mode 100644 index 0000000..500be7f --- /dev/null +++ b/pins/odroid_c2.log @@ -0,0 +1,101 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=latex 2018.1.11) 11 JAN 2018 17:00 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**odroid_c2.tex odroid_c2.dvi +(./odroid_c2.tex +LaTeX2e <2017-04-15> +Babel <3.12> and hyphenation patterns for 3 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: dvips.def on input line 99. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/dvips.def +File: dvips.def 2017/06/20 v3.1d Graphics/color driver for dvips +)) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +Package: color 2016/07/10 v1.1e Standard LaTeX Color (DPC) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package color Info: Driver file: dvips.def on input line 147. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/dvipsnam.def +File: dvipsnam.def 2016/06/17 v3.0m Driver-dependent file (DPC,SPQR) +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2005/04/12 PSNFSS-v9.2a (WaS) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) (./odroid_c2.aux) +\openout1 = `odroid_c2.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Try loading font information for OT1+phv on input line 19. + (/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1phv.fd +File: ot1phv.fd 2001/06/04 scalable font definitions for OT1/phv. +) +LaTeX Font Info: Font shape `OT1/phv/bx/n' in size <10.95> not available +(Font) Font shape `OT1/phv/b/n' tried instead on input line 39. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 44. + +Overfull \hbox (57.53778pt too wide) in paragraph at lines 44--96 + [] + [] + +[1 + +] (./odroid_c2.aux) ) +Here is how much of TeX's memory you used: + 770 strings out of 494932 + 10317 string characters out of 6180877 + 70176 words of memory out of 5000000 + 4123 multiletter control sequences out of 15000+600000 + 7689 words of font info for 26 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 23i,8n,19p,198b,201s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on odroid_c2.dvi (1 page, 8896 bytes). diff --git a/pins/odroid_c2.pdf b/pins/odroid_c2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..24839116f48d8678944ed5cec00bc489c4c6be80 GIT binary patch literal 17411 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 TuMGpr#=*)Cpr#g)69xQ#z)z7# literal 0 HcmV?d00001 diff --git a/pins/odroid_n1.aux b/pins/odroid_n1.aux new file mode 100644 index 0000000..f23e546 --- /dev/null +++ b/pins/odroid_n1.aux @@ -0,0 +1 @@ +\relax diff --git a/pins/odroid_n1.dvi b/pins/odroid_n1.dvi new file mode 100644 index 0000000000000000000000000000000000000000..5f2b42f533ff17a026c48e79f8acb6ca1342e73a GIT binary patch literal 9328 zcmeI2eM}Q)9LKK(iAWURG8e_I8lA%MxaaOl3rr1CqihN&#am20iV)8O|u_${IU?7RSY0P=xN5ca|= zOz5(B#~?iVXLy}nm#^Nv%{AYeXXCAc&2IDhv+c5#7vx;K?Dcn;PkWt#j=$&c3kL%I z6DmD59-qbAP+x7aEUIxE2gZNl%3IBi8IZU!(DoE>bz_Ci-?PT;bJuMubLT5bXBRFhD=uwKN-HXJ*EN?k z)K<9Ax#m^M;FD*Z6;0Rg)VS({;jwM)0i`-+%fN(dKR&ZH_Q1+ozaI$4tNng&eSS{P z7WZa1@2T>6+*N#~r#5Hk&v|tqr`qYO+T!%Na)RL}%67vsgt)7-JL3%^*ufp_zXh-E z7+lxr+rx1iH=2{@v~;GvmJtXvoxjkTJo)8Uxv_0+=uC)f-?1nB=gnO`rH++N=LSlP z9rH?nI!0NDj1Y~sxzbZt=c@F3d~=@#ndr9N`=d_@2H#EIc0Ky4u$kkc|Lixuv~|?^ z3+SB#>63eE24Y|!X`jvi2_)T=HA;o83^UfeDxj>hoh)(s-HlD%H(lrgWS%mipfs!< zSP;TGnw(wYtaT}4{^-KaDW{?|>#aGw}557GWy8z)iw%FdE zp~)lPrV0z-1&c)({*ZX7QIj7^dciU5Avzi;K5tDt0)oL1H~8CV?9w2LUQ{ImJ8gaU6aiaZAhDBPhO)iqqw(%V5L>DQ+g!BpaTB6M`&9$&UzL&QwxQox*^jct6^AB@Xza zWjOWgYp{oqsavVkbMJw=CKZJT8Sge7_5E3rNTpuL3lMo{H%1E~|M1%uGV(|=qYScX zBYpIh$=FlK%xzTWb|&U>*Gz+LkrY%5&8n>qt!3$ZTQJK|k=d|4(+;9&L|r9lg_WSF zsjH9IM{4sTVrejaom~yA%JlYc@D~}X6n2`a*7sbVVHj+r%&UW?2N>B4c~ma|fz1u+ z`wW(0Zdi%CVcaifZ1@p32=Uz@==?)-LoS0G@Sb5kHdAHv(_-#0%hIAUGHdapc)*;VTEqF(wSM)+&%v93$6&sx1Yx@8w z2>M7(5=GHPqm!)B_#rz9s(Hc{PE5c_bTJ3_qUQgVu1H4expAl?DNj^aqy(tb#T>Ay zIa6xLH0#vVSbs#O2c_C&T48o{8RkAFm>n`hc3{cFq$K~wtN|4zx}*a(O=lu+jZ1#o z8`hYdkjjCo>ZmT&6kr6A-ynG_19?n5pxE@HnFbJ%?8N4qaJGSZUb-=A7@!7>)bobV zP^+|cd1-mEmPcA^5jG-%@*{82rC(%|e)25uL06|Jd&$TicD{LWDwK^}p^nA{UtC^# z_uxgkc8m8>yK}YH5w*Mgkdltq`YX^b6Oy2OU_~=BIk)nS8cFPSg@fbr`NC zJ2I^FAW*GAP1jC*$rOeV>%tY*>@qA|A%D@uUt|-1V7@_4lgM-u<}hxYZhc416X-Dd zd`(4!x-NqDLx)KTJ4{sX#2i-Qy9nf%0?E1wESf$>%t>ji!jltv?7hp&$waivFCrGi z`c>x<>Ka}DrAJZ!MPu)U@M}835%I(HO&mWKl5F@TdKVzEbpcs@>lva0YXkJ=p^R}Z zbplNvK!P;X2f(s2x-D5Bq-fDgyzA8#SQOQUSu{3nC5LYSO_dwj9@v+pyx*X=hcRie z$)z3(IcX$%Ga#`w0}ofzEE*dzmA@_8HIK|6*3iWHW7B6w{`9UuV(SXnvIbkz)|(g2 z8ao3eSX)NQ8e5{Rfv7GrV@k83`{P1~swIWRB|v%X#Nq@K1DjpzM?OMg(B)rZlYchH z*tJc(-aO=(7d|}+c>8Mf+xJS>#^%xnzcO)3r5=V_wd@T1u^X8dSnmH)J?yX~x?sy} zg3X3FFCO9-*ML~83CiOKFJY9B7mz6AQSlOf0>|3m$R-2hFYEX! +Babel <3.12> and hyphenation patterns for 3 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: dvips.def on input line 99. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/dvips.def +File: dvips.def 2017/06/20 v3.1d Graphics/color driver for dvips +)) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +Package: color 2016/07/10 v1.1e Standard LaTeX Color (DPC) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package color Info: Driver file: dvips.def on input line 147. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/dvipsnam.def +File: dvipsnam.def 2016/06/17 v3.0m Driver-dependent file (DPC,SPQR) +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2005/04/12 PSNFSS-v9.2a (WaS) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) (./odroid_n1.aux) +\openout1 = `odroid_n1.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Try loading font information for OT1+phv on input line 19. + (/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1phv.fd +File: ot1phv.fd 2001/06/04 scalable font definitions for OT1/phv. +) +LaTeX Font Info: Font shape `OT1/phv/bx/n' in size <10.95> not available +(Font) Font shape `OT1/phv/b/n' tried instead on input line 39. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 44. + +Overfull \hbox (60.91054pt too wide) in paragraph at lines 44--96 + [] + [] + +[1 + +] (./odroid_n1.aux) ) +Here is how much of TeX's memory you used: + 771 strings out of 494932 + 10335 string characters out of 6180877 + 71176 words of memory out of 5000000 + 4124 multiletter control sequences out of 15000+600000 + 7689 words of font info for 26 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 23i,8n,19p,198b,201s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on odroid_n1.dvi (1 page, 9328 bytes). diff --git a/pins/odroid_n1.pdf b/pins/odroid_n1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..50d1af05a18d175eb722f6dd8635b571d6960315 GIT binary patch literal 17832 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 V5vWVU;1#~eer0BsQAu^6zw1>nxyFh+D=j1 z!5Id4+E}04;4?TU;0{+zYN)Thts5hlR~23N$W5 zuIMDTlHbO2zvi4Ph^cXwm+SSA>&+8X?dBaD*dkW7E2KhXro#JMp|LKR>-O)nIK?C`41I8$zK#OM%(E z!MEN=`s;#zUmaQNZ!(Ymxo~5v#oXWx)@|?xIWr%7th@tsqLcXkiG5@Bg6|>TAN&KH z-E(_YTkuVSsINENj9=Y1<+WMiaHQ|TzDfD7wiDC3yWx?yR~Z+_{v6oW>nW*-oR53T zN)}cxXU)~iEs2g+Hu&m83&A(nSO+_7p`x(Qu>a9oe{(Ze8}bL|xjb%m{#$#Kjq?0~ zNt>=E?;JA{MDm}#>KM8*`!2v3;yL-fjqwyHKt5;>eGJG)7Gx&i3nFvbt-`|UPX^rH zkgqNB(EtZefWZkf&Tfv$`^f`#r*hlf-X>0%dg~B!OfYosPQ?yR>@O-tAa&*LnF9lS zj`P-W!D#C4$}0`lxq{{`!0ip(*&XUQvobFtvA`3LE_henX8}S&dc^NfLe(IQoGX;p ze24V#@R1;L0>pFrg~;G6*}Mv_t1;0eWinCX7fZ5jviTz9EINraqM!lgIx>3_&GVgx zOyi5lsXP?3A=?^d;L#^P-+~-fG}LJ*9DZFD8bw-Dp;?i@X7u$S?LnvqhXShKZl3uN z{Y{2cOQ)v&k3$(aWD4NJLiMGi4CRE%n^#)Cge95zLhjXP(1xM{^QAy|xkquT>YXZ31{@ zbBnr{0=A=gS6?5d9U|Ro8tQk(KnDT_riT+ZZfMh$CL+wccDZ`9F6JYxXsg$*i`RjL z*LiZ2DmH0aC6Ywd#u9mCIoo$3k--E}+p(3lGa?4z?<0GQDUzPAPP^dLFNTlPR^idz zm(WI3*#kL@m4napzpUzrlztN((btJKVW%!(n!-ao^SUZB1aSq5c=~Tfr29$4G>Vu? zkJyHR81-o}K~t!{SG8ZI?H2U5Acf?0s2l-L4})+f0e~qHDD=y0l>Bi0A|MlSl=aSJe$N4xJ55IC~$6|o0jS^KmttlEb|Yjgh#b) z!O%8x9aawiH|l7ZLiCN2#&b$6!d48zjFdqDVS8G_Rt&;O3I{3wGOV#_1}6X1N(GuWuD41c_*{GT12GM%PKv04w})oOXe=xrA;24mR*8u!brtKHA8}WB~3Q5ja%y$%^`3| zIZPY^OPV2AyGLK^m9C}F%R8A}dJaSDjJ{(sc#i3Oq+LHa*Rx19HT~BZ5}Q=7IHlE} z$O4oPTJ;Jn%qa*HZREZz%t1b3^i7k&GffP}NKL547>e8~mV`j$VBMo7a)_74z^j?j z*~Gx8GP=VquS6NR`qWG`c)KS^X^63V0tZ3gR~bBCwdE9Q3td_xfmw(Kr`UUtlQ!Q z$X2K_JW>2?auLPqcrIgyaK|WVG(8u1x^h^&Mg7GkuE?QZ$l@|LB|PkU32hiV!y}7C zW&hGBU*Bq3JgddS?~s?g%J3lmy5o5?=~w}uYF2RdQBP|~m^`#b2?Or+0%IJTKXM_~ zKEd7J>jfst>YJzq&qVPMJI6x2-nA{IHCCAR##aa>I0_K2Qx~tsvrR +Babel <3.12> and hyphenation patterns for 3 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: dvips.def on input line 99. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/dvips.def +File: dvips.def 2017/06/20 v3.1d Graphics/color driver for dvips +)) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +Package: color 2016/07/10 v1.1e Standard LaTeX Color (DPC) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package color Info: Driver file: dvips.def on input line 147. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/dvipsnam.def +File: dvipsnam.def 2016/06/17 v3.0m Driver-dependent file (DPC,SPQR) +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2005/04/12 PSNFSS-v9.2a (WaS) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +(./odroid_xu3.aux) +\openout1 = `odroid_xu3.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Try loading font information for OT1+phv on input line 19. + (/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1phv.fd +File: ot1phv.fd 2001/06/04 scalable font definitions for OT1/phv. +) +LaTeX Font Info: Font shape `OT1/phv/bx/n' in size <10.95> not available +(Font) Font shape `OT1/phv/b/n' tried instead on input line 39. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 44. + +Overfull \hbox (43.70856pt too wide) in paragraph at lines 44--96 + [] + [] + +[1 + +] (./odroid_xu3.aux) ) +Here is how much of TeX's memory you used: + 771 strings out of 494932 + 10344 string characters out of 6180877 + 70176 words of memory out of 5000000 + 4124 multiletter control sequences out of 15000+600000 + 7689 words of font info for 26 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 23i,8n,19p,200b,201s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on odroid_xu3.dvi (1 page, 8792 bytes). diff --git a/pins/odroid_xu3.pdf b/pins/odroid_xu3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..77ce7e5c446378688a3a3703e596f3b0429246c2 GIT binary patch literal 18219 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 literal 0 HcmV?d00001 diff --git a/pins/pins.aux b/pins/pins.aux new file mode 100644 index 0000000..f23e546 --- /dev/null +++ b/pins/pins.aux @@ -0,0 +1 @@ +\relax diff --git a/pins/pins.dvi b/pins/pins.dvi new file mode 100644 index 0000000000000000000000000000000000000000..fb2c6e13537d864e9d572c4ea9d0e606f1826fa3 GIT binary patch literal 8420 zcmd^_4{Q@v9LKL^5MUEQAOS(BKoF6YyK8U#GsM6kFxfx0A%ce3bvIh++S1wDkdr@#CCe(!g?sn>0+J~1(!0IxwmPcRg+&l-GXoWG1S&?IFwl9Z96>=Z*Wo52hn zoR;X-1701E`W=2Y5Ol9&pJZ$nBSTuO7C$%3YG#b2In8SJbG!6s4n7p#bt^sVw{W;) zl+)+&1q}YOpvz#G?{PTSRO`;oeW_zu?{%M_=XdG%w>E-LtQzuOI2;z%ezyYiG2|0M z#j$0bBQLVHXNVLadpP(R;&+u7S-8gK?tt67I?rtvk_-)t@-lO`4O;eBp4%(tl$92- za7-)|dWO$;6jl9@>0yKX?h&sM;c8+}+nml(ZErLbMpuNZ4sn)p97P{>ah%^idv-;1 zVZYnx^p(!$_Zjwo0K`@kt;gplQp?xAQt}*_T)UA-ew!dlN_5xj8+H$$?hJ>kE;Q{< zTCrmjG2+!8II@GNU-fJ4pL>fN^Qfo=g)SBvknI2#Kx;&&&+BEKoG%cm>-!YX?@KzN z?_0W7PY``?>Xe&o8+@S&?$P<+m_|=0LNH+AJ_7`+j44rwLN7bXR$<|Vt3S=p$c95u zkT81MH?>j|cmU-v|5c8olof_fZ9>Kb-MicSRfCDw4)Tco+eWl|p|r)UqnHhd{rk#4 zsiV&j*e$^JI>&@Rqza+AGKIQ*lP)Xm6cjW0y?r1tRFPGM>`5WSwgXA;AQK>%&#enP zCQ5FJ!0I9cWh4y-viFzCXeyVux{%Ve2w6nN0eWE9tyYTXt966RKSZYT&_8v_`@W~) z=nUHhWK_0LwQi0#q>x4$nSN;uB5YJMDhzUe|Cf4X4|wgme*=0=f)wYQQ*G(c0j!em zo(~Hv$!q!Ll%0h4LaLZwPTOfArSc-WGGKAE{1Ch-b)9zpm^86RbUoU zFU~_)z=&|javsk!cJIL;YmpL_2PwS6T2zTzH4(LZK`6AvZlq{jD6Cu{RrbI%WuUEG z>!i%WBU9{h%XO!j42lsZx7*MWMSMVpHAUG|wgn2^u>c#@t?mhUpf**Y6se8q!y6RJ z5Tf}g(Uf($i1{$0LZVDuqG=k4qA9mG;*zMtR?_*DMVPtnDf#}|JeHLDg$9rPed!fS zJ&RG=(irLKQ4sF^?r-NZct25U>SBzoSjJ~JFQ5d745=s-PK!lMqlgPOwZWuDOJXi< zQPv<@g9NQ+6vn3^a`m)E-AP{iuL7?Lg$(?drU&lFrU5`zPiB<1Y^KSN&1&j;{g^hz z^JB9HKStbKQ}F#aN?how>Isd~meDj(WwcPm=QI!<7!6dB=l}w?9hSTl4MTVTkq4B$ zFbI=a=RIP}Q4MoUc5XqY)Q+LeOVRHVJ&M6H7gAQwawwV5)uiAGsxce3 z8cU2dvmp1MW2Mzo8+{j3TbfjzJn_at0=|3z&YL!1=QS%JL+7Qi&U?6hvAXjXWMnOo z+A*~9X${Uxt7kJ>TQ;+dyQMBJVTLAD5i0P#NSvuOxX`YD~bEG@5O@#Eg>!& z7tZl*emC+vgRjh{Ibf zO0Uq7d`Hj^ITY!FHjeI?QNv{>pZ0~0~N*X09!Ubq2YI~sItVM|rt z6$u*~N}P)uc~DPzl;i7H5Djsim_Vw#JPS8hkIJ&+7qKLXU%mQYBT1 zq}L4g?!URf8(cpRrXZjqVOJR(h7$B_i8}MiXv;S_^fekE(NdIJ87Bv7cUIoqO)BFYn8EZpPyp|;7p%3BM!AQONxVt-pYCS}EK-Hx5M7+C^y zHvF;s5-eGW8-YE@)M!tcxVh)sXvH#yIfIPK7OK`wKOR&Fi?%yr-57bhd*swiWJSn* ztGH8ft$p0f=rsvaj2D9ZaJ$5|D5{hfuVm5KlRmMt^`t_)qLW~imMO!gG$X2HJYbCt zz``meKG +Babel <3.12> and hyphenation patterns for 3 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size12.clo +File: size12.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: dvips.def on input line 99. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/dvips.def +File: dvips.def 2017/06/20 v3.1d Graphics/color driver for dvips +)) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +Package: color 2016/07/10 v1.1e Standard LaTeX Color (DPC) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package color Info: Driver file: dvips.def on input line 147. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/dvipsnam.def +File: dvipsnam.def 2016/06/17 v3.0m Driver-dependent file (DPC,SPQR) +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2005/04/12 PSNFSS-v9.2a (WaS) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +No file pins.aux. +\openout1 = `pins.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Try loading font information for OT1+phv on input line 19. +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1phv.fd +File: ot1phv.fd 2001/06/04 scalable font definitions for OT1/phv. +) +LaTeX Font Info: Font shape `OT1/phv/bx/n' in size <12> not available +(Font) Font shape `OT1/phv/b/n' tried instead on input line 39. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <12> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 44. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 44. + +Overfull \hbox (41.3954pt too wide) in paragraph at lines 44--82 + [] + [] + + +Overfull \hbox (28.05157pt too wide) in paragraph at lines 92--112 + [] + [] + +[1 + +] (./pins.aux) ) +Here is how much of TeX's memory you used: + 770 strings out of 494932 + 10241 string characters out of 6180877 + 70180 words of memory out of 5000000 + 4123 multiletter control sequences out of 15000+600000 + 7687 words of font info for 26 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 23i,8n,19p,188b,201s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on pins.dvi (1 page, 8420 bytes). diff --git a/wiringPi/Makefile b/wiringPi/Makefile index ecf9b75..a96118c 100755 --- a/wiringPi/Makefile +++ b/wiringPi/Makefile @@ -51,7 +51,8 @@ LIBS = -lm -lpthread -lrt -lcrypt SRC = wiring${BRAND_NAME}.c \ wiringSerial.c wiringShift.c \ piHiPri.c piThread.c \ - wiringPiSPI.c wiringPiI2C.c \ + wiring${BRAND_NAME}SPI.c \ + wiring${BRAND_NAME}I2C.c \ softPwm.c softTone.c \ mcp23008.c mcp23016.c mcp23017.c \ mcp23s08.c mcp23s17.c \ @@ -60,13 +61,12 @@ SRC = wiring${BRAND_NAME}.c \ mcp3002.c mcp3004.c mcp4802.c mcp3422.c \ max31855.c max5322.c ads1115.c \ sn3218.c \ - bmp180.c htu21d.c ds18b20.c rht03.c \ + bmp180.c htu21d.c ds18b20.c \ drcSerial.c drcNet.c \ pseudoPins.c \ wpiExtensions.c ifeq ($(BRAND_NAME), Odroid) - DEFS += -D BOARD_ODROID SRC += odroidc1.c \ odroidc2.c \ odroidxu3.c \ diff --git a/wiringPi/wiringOdroid.c b/wiringPi/wiringOdroid.c index 738479c..1f1f51d 100755 --- a/wiringPi/wiringOdroid.c +++ b/wiringPi/wiringOdroid.c @@ -29,10 +29,8 @@ #include "softTone.h" /*----------------------------------------------------------------------------*/ -#include "wiringPi.h" -#include "../version.h" - #include "wiringOdroid.h" +#include "../version.h" #include "odroidc1.h" #include "odroidc2.h" @@ -432,7 +430,7 @@ void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) int wpiPinToGpio (int wpiPin) { if (libwiring.getModeToGpio) - return libwiring.getModeToGpio(WPI_MODE_PINS, wpiPin); + return libwiring.getModeToGpio(MODE_PINS, wpiPin); return -1; } @@ -447,7 +445,7 @@ int wpiPinToGpio (int wpiPin) int physPinToGpio (int physPin) { if (libwiring.getModeToGpio) - return libwiring.getModeToGpio(WPI_MODE_PHYS, physPin); + return libwiring.getModeToGpio(MODE_PHYS, physPin); return -1; } @@ -582,7 +580,7 @@ int wiringPiISR (int pin, int mode, void (*function)(void)) char c; int GpioPin; - if (libwiring.mode == WPI_MODE_UNINITIALISED) + if (libwiring.mode == MODE_UNINITIALISED) return wiringPiFailure ( WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. " \ @@ -801,7 +799,7 @@ int wiringPiSetup (void) for(i = 0; i < 256; i++) libwiring.sysFds[i] = -1; // init wiringPi mode - libwiring.mode = WPI_MODE_UNINITIALISED; + libwiring.mode = MODE_UNINITIALISED; if (getenv (ENV_DEBUG) != NULL) wiringPiDebug = TRUE; @@ -839,7 +837,7 @@ int wiringPiSetup (void) initialiseEpoch (); - libwiring.mode = WPI_MODE_PINS; + libwiring.mode = MODE_PINS; return 0; } @@ -859,7 +857,7 @@ int wiringPiSetupGpio (void) if (wiringPiDebug) printf ("wiringPi: wiringPiSetupGpio called\n") ; - libwiring.mode = WPI_MODE_GPIO; + libwiring.mode = MODE_GPIO; return 0 ; } @@ -879,7 +877,7 @@ int wiringPiSetupPhys (void) if (wiringPiDebug) printf ("wiringPi: wiringPiSetupPhys called\n") ; - libwiring.mode = WPI_MODE_PHYS ; + libwiring.mode = MODE_PHYS ; return 0 ; } @@ -922,7 +920,7 @@ int wiringPiSetupSys (void) initialiseEpoch (); - libwiring.mode = WPI_MODE_GPIO_SYS; + libwiring.mode = MODE_GPIO_SYS; return 0; } diff --git a/wiringPi/wiringOdroid.h b/wiringPi/wiringOdroid.h index a406eba..f280b99 100755 --- a/wiringPi/wiringOdroid.h +++ b/wiringPi/wiringOdroid.h @@ -31,6 +31,14 @@ #include /*----------------------------------------------------------------------------*/ + +#ifndef TRUE +#define TRUE (1==1) +#define FALSE (!TRUE) +#endif + +#define UNU __attribute__((unused)) + #define ENV_DEBUG "WIRINGPI_DEBUG" #define ENV_CODES "WIRINGPI_CODES" #define ENV_GPIOMEM "WIRINGPI_GPIOMEM" @@ -70,15 +78,33 @@ #define PUD_DOWN 1 #define PUD_UP 2 +// Interrupt levels +#define INT_EDGE_SETUP 0 +#define INT_EDGE_FALLING 1 +#define INT_EDGE_RISING 2 +#define INT_EDGE_BOTH 3 + // Module names #define AML_MODULE_I2C "aml_i2c" +// Threads +#define PI_THREAD(X) void *X (UNU void *dummy) + +// Failure modes +#define WPI_FATAL (1==1) +#define WPI_ALMOST (1==2) + +extern const char *piModelNames [16]; +extern const char *piRevisionNames [16]; +extern const char *piMakerNames [16]; +extern const int piMemorySize [ 8]; + /*----------------------------------------------------------------------------*/ #define PAGE_SIZE (4*1024) #define BLOCK_SIZE (4*1024) /*----------------------------------------------------------------------------*/ -/* Debuf message display function */ +/* Debug message display function */ /*----------------------------------------------------------------------------*/ #define MSG_ERR -1 #define MSG_WARN -2 @@ -98,6 +124,45 @@ extern int moduleLoaded(char *); } #endif +/*----------------------------------------------------------------------------*/ +// wiringPiNodeStruct: +// This describes additional device nodes in the extended wiringPi +// 2.0 scheme of things. +// It's a simple linked list for now, but will hopefully migrate to +// a binary tree for efficiency reasons - but then again, the chances +// of more than 1 or 2 devices being added are fairly slim, so who +// knows.... +/*----------------------------------------------------------------------------*/ +struct wiringPiNodeStruct +{ + int pinBase; + int pinMax; + + int fd; // Node specific + unsigned int data0; // ditto + unsigned int data1; // ditto + unsigned int data2; // ditto + unsigned int data3; // ditto + + void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode); + void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode); + int (*digitalRead) (struct wiringPiNodeStruct *node, int pin); + // unsigned int (*digitalRead8) (struct wiringPiNodeStruct *node, int pin); + void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value); + // void (*digitalWrite8) (struct wiringPiNodeStruct *node, int pin, int value); + void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value); + int (*analogRead) (struct wiringPiNodeStruct *node, int pin); + void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value); + + struct wiringPiNodeStruct *next; +}; + +extern struct wiringPiNodeStruct *wiringPiNodes; +extern struct wiringPiNodeStruct *wiringPiFindNode (int pin); +extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins); + +extern int wiringPiFailure (int fatal, const char *message, ...) ; + /*----------------------------------------------------------------------------*/ struct libodroid { diff --git a/wiringPi/wiringPiI2C.c b/wiringPi/wiringOdroidI2C.c old mode 100755 new mode 100644 similarity index 95% rename from wiringPi/wiringPiI2C.c rename to wiringPi/wiringOdroidI2C.c index 312e13e..3216e1d --- a/wiringPi/wiringPiI2C.c +++ b/wiringPi/wiringOdroidI2C.c @@ -216,9 +216,6 @@ int wiringPiI2CSetupInterface (const char *device, int devId) * Open the I2C device, and regsiter the target device ********************************************************************************* */ -#if defined(BOARD_ODROID) - -#include "wiringOdroid.h" int wiringPiI2CSetup (const int devId) { @@ -239,22 +236,3 @@ int wiringPiI2CSetup (const int devId) return wiringPiI2CSetupInterface (device, devId) ; } - -#else - -int wiringPiI2CSetup (const int devId) -{ - int rev ; - const char *device ; - - rev = piGpioLayout () ; - - if (rev == 1) - device = "/dev/i2c-0" ; - else - device = "/dev/i2c-1" ; - - return wiringPiI2CSetupInterface (device, devId) ; -} - -#endif // #defined(BOARD_ODROID) diff --git a/wiringPi/wiringOdroidI2C.h b/wiringPi/wiringOdroidI2C.h new file mode 100644 index 0000000..6db8c68 --- /dev/null +++ b/wiringPi/wiringOdroidI2C.h @@ -0,0 +1,42 @@ +/* + * wiringPiI2C.h: + * Simplified I2C access routines + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see . + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int wiringPiI2CRead (int fd) ; +extern int wiringPiI2CReadReg8 (int fd, int reg) ; +extern int wiringPiI2CReadReg16 (int fd, int reg) ; + +extern int wiringPiI2CWrite (int fd, int data) ; +extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; +extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; + +extern int wiringPiI2CSetupInterface (const char *device, int devId) ; +extern int wiringPiI2CSetup (const int devId) ; + +#ifdef __cplusplus +} +#endif diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringOdroidSPI.c old mode 100755 new mode 100644 similarity index 76% rename from wiringPi/wiringPiSPI.c rename to wiringPi/wiringOdroidSPI.c index acf5cc2..12c4249 --- a/wiringPi/wiringPiSPI.c +++ b/wiringPi/wiringOdroidSPI.c @@ -32,17 +32,16 @@ #include #include "wiringPi.h" - #include "wiringPiSPI.h" // The SPI bus parameters // Variables as they need to be passed as pointers later on -static const char *spiDev0 = "/dev/spidev0.0" ; -static const char *spiDev1 = "/dev/spidev0.1" ; -static const uint8_t spiBPW = 8 ; -static const uint16_t spiDelay = 0 ; +static const char *spiDevType0 = "/dev/spidev0.0"; +static const char *spiDevType1 = "/dev/spidev1.0"; +static const uint8_t spiBPW = 8; +static const uint16_t spiDelay = 0; static uint32_t spiSpeeds [2] ; static int spiFds [2] ; @@ -97,10 +96,6 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ********************************************************************************* */ -#if defined(BOARD_ODROID) - -#include "wiringOdroid.h" - int wiringPiSPISetupMode (int channel, int speed, int mode) { int fd ; @@ -112,18 +107,18 @@ int wiringPiSPISetupMode (int channel, int speed, int mode) mode &= 3 ; // Mode is 0, 1, 2 or 3 channel &= 1 ; // Channel is 0 or 1 - if (channel || model == MODEL_ODROID_C2) { + if (model == MODEL_ODROID_C2) { return wiringPiFailure (WPI_ALMOST, "Can't support spi device. check model or spi channel.\n"); } switch(model) { case MODEL_ODROID_C1: - device = "/dev/spidev0.0"; + device = spiDevType0; break; case MODEL_ODROID_XU3: case MODEL_ODROID_N1: - device = "/dev/spidev1.0"; + device = spiDevType1; break; } @@ -149,36 +144,6 @@ int wiringPiSPISetupMode (int channel, int speed, int mode) return fd ; } -#else - -int wiringPiSPISetupMode (int channel, int speed, int mode) -{ - int fd ; - - mode &= 3 ; // Mode is 0, 1, 2 or 3 - channel &= 1 ; // Channel is 0 or 1 - - if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0) - return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; - - spiSpeeds [channel] = speed ; - spiFds [channel] = fd ; - -// Set SPI parameters. - - if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ; - - if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; - - if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI Speed Change failure: %s\n", strerror (errno)) ; - - return fd ; -} - -#endif // #defined(BOARD_ODROID) /* * wiringPiSPISetup: diff --git a/wiringPi/wiringOdroidSPI.h b/wiringPi/wiringOdroidSPI.h new file mode 100644 index 0000000..3980321 --- /dev/null +++ b/wiringPi/wiringOdroidSPI.h @@ -0,0 +1,36 @@ +/* + * wiringPiSPI.h: + * Simplified SPI access routines + * Copyright (c) 2012-2015 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see . + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +int wiringPiSPIGetFd (int channel) ; +int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; +int wiringPiSPISetupMode (int channel, int speed, int mode) ; +int wiringPiSPISetup (int channel, int speed) ; + +#ifdef __cplusplus +} +#endif diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c deleted file mode 100644 index bd1a369..0000000 --- a/wiringPi/wiringPi.c +++ /dev/null @@ -1,2373 +0,0 @@ -/* - * wiringPi: - * Arduino look-a-like Wiring library for the Raspberry Pi - * Copyright (c) 2012-2017 Gordon Henderson - * Additional code for pwmSetClock by Chris Hall - * - * Thanks to code samples from Gert Jan van Loo and the - * BCM2835 ARM Peripherals manual, however it's missing - * the clock section /grr/mutter/ - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -// Revisions: -// 19 Jul 2012: -// Moved to the LGPL -// Added an abstraction layer to the main routines to save a tiny -// bit of run-time and make the clode a little cleaner (if a little -// larger) -// Added waitForInterrupt code -// Added piHiPri code -// -// 9 Jul 2012: -// Added in support to use the /sys/class/gpio interface. -// 2 Jul 2012: -// Fixed a few more bugs to do with range-checking when in GPIO mode. -// 11 Jun 2012: -// Fixed some typos. -// Added c++ support for the .h file -// Added a new function to allow for using my "pin" numbers, or native -// GPIO pin numbers. -// Removed my busy-loop delay and replaced it with a call to delayMicroseconds -// -// 02 May 2012: -// Added in the 2 UART pins -// Change maxPins to numPins to more accurately reflect purpose - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "softPwm.h" -#include "softTone.h" - -#include "wiringPi.h" -#include "../version.h" - -// Environment Variables - -#define ENV_DEBUG "WIRINGPI_DEBUG" -#define ENV_CODES "WIRINGPI_CODES" -#define ENV_GPIOMEM "WIRINGPI_GPIOMEM" - - -// Extend wiringPi with other pin-based devices and keep track of -// them in this structure - -struct wiringPiNodeStruct *wiringPiNodes = NULL ; - -// BCM Magic - -#define BCM_PASSWORD 0x5A000000 - - -// The BCM2835 has 54 GPIO pins. -// BCM2835 data sheet, Page 90 onwards. -// There are 6 control registers, each control the functions of a block -// of 10 pins. -// Each control register has 10 sets of 3 bits per GPIO pin - the ALT values -// -// 000 = GPIO Pin X is an input -// 001 = GPIO Pin X is an output -// 100 = GPIO Pin X takes alternate function 0 -// 101 = GPIO Pin X takes alternate function 1 -// 110 = GPIO Pin X takes alternate function 2 -// 111 = GPIO Pin X takes alternate function 3 -// 011 = GPIO Pin X takes alternate function 4 -// 010 = GPIO Pin X takes alternate function 5 -// -// So the 3 bits for port X are: -// X / 10 + ((X % 10) * 3) - -// Port function select bits - -#define FSEL_INPT 0b000 -#define FSEL_OUTP 0b001 -#define FSEL_ALT0 0b100 -#define FSEL_ALT1 0b101 -#define FSEL_ALT2 0b110 -#define FSEL_ALT3 0b111 -#define FSEL_ALT4 0b011 -#define FSEL_ALT5 0b010 - -// Access from ARM Running Linux -// Taken from Gert/Doms code. Some of this is not in the manual -// that I can find )-: -// -// Updates in September 2015 - all now static variables (and apologies for the caps) -// due to the Pi v2, v3, etc. and the new /dev/gpiomem interface - -static volatile unsigned int GPIO_PADS ; -static volatile unsigned int GPIO_CLOCK_BASE ; -static volatile unsigned int GPIO_BASE ; -static volatile unsigned int GPIO_TIMER ; -static volatile unsigned int GPIO_PWM ; - -#define PAGE_SIZE (4*1024) -#define BLOCK_SIZE (4*1024) - -// PWM -// Word offsets into the PWM control region - -#define PWM_CONTROL 0 -#define PWM_STATUS 1 -#define PWM0_RANGE 4 -#define PWM0_DATA 5 -#define PWM1_RANGE 8 -#define PWM1_DATA 9 - -// Clock regsiter offsets - -#define PWMCLK_CNTL 40 -#define PWMCLK_DIV 41 - -#define PWM0_MS_MODE 0x0080 // Run in MS mode -#define PWM0_USEFIFO 0x0020 // Data from FIFO -#define PWM0_REVPOLAR 0x0010 // Reverse polarity -#define PWM0_OFFSTATE 0x0008 // Ouput Off state -#define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty -#define PWM0_SERIAL 0x0002 // Run in serial mode -#define PWM0_ENABLE 0x0001 // Channel Enable - -#define PWM1_MS_MODE 0x8000 // Run in MS mode -#define PWM1_USEFIFO 0x2000 // Data from FIFO -#define PWM1_REVPOLAR 0x1000 // Reverse polarity -#define PWM1_OFFSTATE 0x0800 // Ouput Off state -#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty -#define PWM1_SERIAL 0x0200 // Run in serial mode -#define PWM1_ENABLE 0x0100 // Channel Enable - -// Timer -// Word offsets - -#define TIMER_LOAD (0x400 >> 2) -#define TIMER_VALUE (0x404 >> 2) -#define TIMER_CONTROL (0x408 >> 2) -#define TIMER_IRQ_CLR (0x40C >> 2) -#define TIMER_IRQ_RAW (0x410 >> 2) -#define TIMER_IRQ_MASK (0x414 >> 2) -#define TIMER_RELOAD (0x418 >> 2) -#define TIMER_PRE_DIV (0x41C >> 2) -#define TIMER_COUNTER (0x420 >> 2) - -// Locals to hold pointers to the hardware - -static volatile uint32_t *gpio ; -static volatile uint32_t *pwm ; -static volatile uint32_t *clk ; -static volatile uint32_t *pads ; - -#ifdef USE_TIMER -static volatile uint32_t *timer ; -static volatile uint32_t *timerIrqRaw ; -#endif - -// Data for use with the boardId functions. -// The order of entries here to correspond with the PI_MODEL_X -// and PI_VERSION_X defines in wiringPi.h -// Only intended for the gpio command - use at your own risk! - -// piGpioBase: -// The base address of the GPIO memory mapped hardware IO - -#define GPIO_PERI_BASE_OLD 0x20000000 -#define GPIO_PERI_BASE_NEW 0x3F000000 - -static volatile unsigned int piGpioBase = 0 ; - -const char *piModelNames [16] = -{ - "Model A", // 0 - "Model B", // 1 - "Model A+", // 2 - "Model B+", // 3 - "Pi 2", // 4 - "Alpha", // 5 - "CM", // 6 - "Unknown07", // 07 - "Pi 3", // 08 - "Pi Zero", // 09 - "CM3", // 10 - "Unknown11", // 11 - "Pi Zero-W", // 12 - "Unknown13", // 13 - "Unknown14", // 14 - "Unknown15", // 15 -} ; - -const char *piRevisionNames [16] = -{ - "00", - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", -} ; - -const char *piMakerNames [16] = -{ - "Sony", // 0 - "Egoman", // 1 - "Embest", // 2 - "Unknown", // 3 - "Embest", // 4 - "Unknown05", // 5 - "Unknown06", // 6 - "Unknown07", // 7 - "Unknown08", // 8 - "Unknown09", // 9 - "Unknown10", // 10 - "Unknown11", // 11 - "Unknown12", // 12 - "Unknown13", // 13 - "Unknown14", // 14 - "Unknown15", // 15 -} ; - -const int piMemorySize [8] = -{ - 256, // 0 - 512, // 1 - 1024, // 2 - 0, // 3 - 0, // 4 - 0, // 5 - 0, // 6 - 0, // 7 -} ; - -// Time for easy calculations - -static uint64_t epochMilli, epochMicro ; - -// Misc - -static int wiringPiMode = WPI_MODE_UNINITIALISED ; -static volatile int pinPass = -1 ; -static pthread_mutex_t pinMutex ; - -// Debugging & Return codes - -int wiringPiDebug = FALSE ; -int wiringPiReturnCodes = FALSE ; - -// Use /dev/gpiomem ? - -int wiringPiTryGpioMem = FALSE ; - -// sysFds: -// Map a file descriptor from the /sys/class/gpio/gpioX/value - -static int sysFds [64] = -{ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -} ; - -// ISR Data - -static void (*isrFunctions [64])(void) ; - - -// Doing it the Arduino way with lookup tables... -// Yes, it's probably more innefficient than all the bit-twidling, but it -// does tend to make it all a bit clearer. At least to me! - -// pinToGpio: -// Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin -// Cope for 3 different board revisions here. - -static int *pinToGpio ; - -// Revision 1, 1.1: - -static int pinToGpioR1 [64] = -{ - 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 - 0, 1, // I2C - SDA1, SCL1 wpi 8 - 9 - 8, 7, // SPI - CE1, CE0 wpi 10 - 11 - 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 - 14, 15, // UART - Tx, Rx wpi 15 - 16 - -// Padding: - - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 31 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; - -// Revision 2: - -static int pinToGpioR2 [64] = -{ - 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 - 2, 3, // I2C - SDA0, SCL0 wpi 8 - 9 - 8, 7, // SPI - CE1, CE0 wpi 10 - 11 - 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 - 14, 15, // UART - Tx, Rx wpi 15 - 16 - 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 wpi 17 - 20 - 5, 6, 13, 19, 26, // B+ wpi 21, 22, 23, 24, 25 - 12, 16, 20, 21, // B+ wpi 26, 27, 28, 29 - 0, 1, // B+ wpi 30, 31 - -// Padding: - - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; - - -// physToGpio: -// Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin -// Cope for 2 different board revisions here. -// Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56 - -static int *physToGpio ; - -static int physToGpioR1 [64] = -{ - -1, // 0 - -1, -1, // 1, 2 - 0, -1, - 1, -1, - 4, 14, - -1, 15, - 17, 18, - 21, -1, - 22, 23, - -1, 24, - 10, -1, - 9, 25, - 11, 8, - -1, 7, // 25, 26 - - -1, -1, -1, -1, -1, // ... 31 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; - -static int physToGpioR2 [64] = -{ - -1, // 0 - -1, -1, // 1, 2 - 2, -1, - 3, -1, - 4, 14, - -1, 15, - 17, 18, - 27, -1, - 22, 23, - -1, 24, - 10, -1, - 9, 25, - 11, 8, - -1, 7, // 25, 26 - -// B+ - - 0, 1, - 5, -1, - 6, 12, - 13, -1, - 19, 16, - 26, 20, - -1, 21, - -// the P5 connector on the Rev 2 boards: - - -1, -1, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - 28, 29, - 30, 31, - -1, -1, - -1, -1, - -1, -1, - -1, -1, -} ; - -// gpioToGPFSEL: -// Map a BCM_GPIO pin to it's Function Selection -// control port. (GPFSEL 0-5) -// Groups of 10 - 3 bits per Function - 30 bits per port - -static uint8_t gpioToGPFSEL [] = -{ - 0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2, - 3,3,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5, -} ; - - -// gpioToShift -// Define the shift up for the 3 bits per pin in each GPFSEL port - -static uint8_t gpioToShift [] = -{ - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, -} ; - - -// gpioToGPSET: -// (Word) offset to the GPIO Set registers for each GPIO pin - -static uint8_t gpioToGPSET [] = -{ - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, -} ; - -// gpioToGPCLR: -// (Word) offset to the GPIO Clear registers for each GPIO pin - -static uint8_t gpioToGPCLR [] = -{ - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, -} ; - - -// gpioToGPLEV: -// (Word) offset to the GPIO Input level registers for each GPIO pin - -static uint8_t gpioToGPLEV [] = -{ - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, -} ; - - -#ifdef notYetReady -// gpioToEDS -// (Word) offset to the Event Detect Status - -static uint8_t gpioToEDS [] = -{ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, -} ; - -// gpioToREN -// (Word) offset to the Rising edge ENable register - -static uint8_t gpioToREN [] = -{ - 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -} ; - -// gpioToFEN -// (Word) offset to the Falling edgde ENable register - -static uint8_t gpioToFEN [] = -{ - 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, - 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -} ; -#endif - - -// GPPUD: -// GPIO Pin pull up/down register - -#define GPPUD 37 - -// gpioToPUDCLK -// (Word) offset to the Pull Up Down Clock regsiter - -static uint8_t gpioToPUDCLK [] = -{ - 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, - 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, -} ; - - -// gpioToPwmALT -// the ALT value to put a GPIO pin into PWM mode - -static uint8_t gpioToPwmALT [] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 - 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15 - 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 - FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 -} ; - - -// gpioToPwmPort -// The port value to put a GPIO pin into PWM mode - -static uint8_t gpioToPwmPort [] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 - 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15 - 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 - PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 - -} ; - -// gpioToGpClkALT: -// ALT value to put a GPIO pin into GP Clock mode. -// On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21 -// for clocks 0 and 1 respectively, however I'll include the full -// list for completeness - maybe one day... - -#define GPIO_CLOCK_SOURCE 1 - -// gpioToGpClkALT0: - -static uint8_t gpioToGpClkALT0 [] = -{ - 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7 - 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15 - 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39 - 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 -} ; - -// gpioToClk: -// (word) Offsets to the clock Control and Divisor register - -static uint8_t gpioToClkCon [] = -{ - -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7 - -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 - -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23 - -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 - 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39 - -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47 - -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 - -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 -} ; - -static uint8_t gpioToClkDiv [] = -{ - -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7 - -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 - -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23 - -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 - 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39 - -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47 - -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 - -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 -} ; - - -/* - * Functions - ********************************************************************************* - */ - - -/* - * wiringPiFailure: - * Fail. Or not. - ********************************************************************************* - */ - -int wiringPiFailure (int fatal, const char *message, ...) -{ - va_list argp ; - char buffer [1024] ; - - if (!fatal && wiringPiReturnCodes) - return -1 ; - - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; - - fprintf (stderr, "%s", buffer) ; - exit (EXIT_FAILURE) ; - - return 0 ; -} - - -/* - * piGpioLayout: - * Return a number representing the hardware revision of the board. - * This is not strictly the board revision but is used to check the - * layout of the GPIO connector - and there are 2 types that we are - * really interested in here. The very earliest Pi's and the - * ones that came after that which switched some pins .... - * - * Revision 1 really means the early Model A and B's. - * Revision 2 is everything else - it covers the B, B+ and CM. - * ... and the Pi 2 - which is a B+ ++ ... - * ... and the Pi 0 - which is an A+ ... - * - * The main difference between the revision 1 and 2 system that I use here - * is the mapping of the GPIO pins. From revision 2, the Pi Foundation changed - * 3 GPIO pins on the (original) 26-way header - BCM_GPIO 22 was dropped and - * replaced with 27, and 0 + 1 - I2C bus 0 was changed to 2 + 3; I2C bus 1. - * - * Additionally, here we set the piModel2 flag too. This is again, nothing to - * do with the actual model, but the major version numbers - the GPIO base - * hardware address changed at model 2 and above (not the Zero though) - * - ********************************************************************************* - */ - -static void piGpioLayoutOops (const char *why) -{ - fprintf (stderr, "Oops: Unable to determine board revision from /proc/cpuinfo\n") ; - fprintf (stderr, " -> %s\n", why) ; - fprintf (stderr, " -> You'd best google the error to find out why.\n") ; -//fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ; - exit (EXIT_FAILURE) ; -} - -int piGpioLayout (void) -{ - FILE *cpuFd ; - char line [120] ; - char *c ; - static int gpioLayout = -1 ; - - if (gpioLayout != -1) // No point checking twice - return gpioLayout ; - - if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) - piGpioLayoutOops ("Unable to open /proc/cpuinfo") ; - -// Start by looking for the Architecture to make sure we're really running -// on a Pi. I'm getting fed-up with people whinging at me because -// they can't get it to work on weirdFruitPi boards... - - while (fgets (line, 120, cpuFd) != NULL) - if (strncmp (line, "Hardware", 8) == 0) - break ; - - if (strncmp (line, "Hardware", 8) != 0) - piGpioLayoutOops ("No \"Hardware\" line") ; - - if (wiringPiDebug) - printf ("piGpioLayout: Hardware: %s\n", line) ; - -// See if it's BCM2708 or BCM2709 or the new BCM2835. - -// OK. As of Kernel 4.8, we have BCM2835 only, regardless of model. -// However I still want to check because it will trap the cheapskates and rip- -// off merchants who want to use wiringPi on non-Raspberry Pi platforms - which -// I do not support so don't email me your bleating whinges about anything -// other than a genuine Raspberry Pi. - - if (! (strstr (line, "BCM2708") || strstr (line, "BCM2709") || strstr (line, "BCM2835"))) - { - fprintf (stderr, "Unable to determine hardware version. I see: %s,\n", line) ; - fprintf (stderr, " - expecting BCM2708, BCM2709 or BCM2835.\n") ; - fprintf (stderr, "If this is a genuine Raspberry Pi then please report this\n") ; - fprintf (stderr, "to projects@drogon.net. If this is not a Raspberry Pi then you\n") ; - fprintf (stderr, "are on your own as wiringPi is designed to support the\n") ; - fprintf (stderr, "Raspberry Pi ONLY.\n") ; - exit (EXIT_FAILURE) ; - } - -// Right - we're Probably on a Raspberry Pi. Check the revision field for the real -// hardware type -// In-future, I ought to use the device tree as there are now Pi entries in -// /proc/device-tree/ ... -// but I'll leave that for the next revision. - -// Isolate the Revision line - - rewind (cpuFd) ; - while (fgets (line, 120, cpuFd) != NULL) - if (strncmp (line, "Revision", 8) == 0) - break ; - - fclose (cpuFd) ; - - if (strncmp (line, "Revision", 8) != 0) - piGpioLayoutOops ("No \"Revision\" line") ; - -// Chomp trailing CR/NL - - for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) - *c = 0 ; - - if (wiringPiDebug) - printf ("piGpioLayout: Revision string: %s\n", line) ; - -// Scan to the first character of the revision number - - for (c = line ; *c ; ++c) - if (*c == ':') - break ; - - if (*c != ':') - piGpioLayoutOops ("Bogus \"Revision\" line (no colon)") ; - -// Chomp spaces - - ++c ; - while (isspace (*c)) - ++c ; - - if (!isxdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)") ; - -// Make sure its long enough - - if (strlen (c) < 4) - piGpioLayoutOops ("Bogus revision line (too small)") ; - -// Isolate last 4 characters: (in-case of overvolting or new encoding scheme) - - c = c + strlen (c) - 4 ; - - if (wiringPiDebug) - printf ("piGpioLayout: last4Chars are: \"%s\"\n", c) ; - - if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0)) - gpioLayout = 1 ; - else - gpioLayout = 2 ; // Covers everything else from the B revision 2 to the B+, the Pi v2, v3, zero and CM's. - - if (wiringPiDebug) - printf ("piGpioLayoutOops: Returning revision: %d\n", gpioLayout) ; - - return gpioLayout ; -} - -/* - * piBoardRev: - * Deprecated, but does the same as piGpioLayout - ********************************************************************************* - */ - -int piBoardRev (void) -{ - return piGpioLayout () ; -} - - - -/* - * piBoardId: - * Return the real details of the board we have. - * - * This is undocumented and really only intended for the GPIO command. - * Use at your own risk! - * - * Seems there are some boards with 0000 in them (mistake in manufacture) - * So the distinction between boards that I can see is: - * - * 0000 - Error - * 0001 - Not used - * - * Original Pi boards: - * 0002 - Model B, Rev 1, 256MB, Egoman - * 0003 - Model B, Rev 1.1, 256MB, Egoman, Fuses/D14 removed. - * - * Newer Pi's with remapped GPIO: - * 0004 - Model B, Rev 1.2, 256MB, Sony - * 0005 - Model B, Rev 1.2, 256MB, Egoman - * 0006 - Model B, Rev 1.2, 256MB, Egoman - * - * 0007 - Model A, Rev 1.2, 256MB, Egoman - * 0008 - Model A, Rev 1.2, 256MB, Sony - * 0009 - Model A, Rev 1.2, 256MB, Egoman - * - * 000d - Model B, Rev 1.2, 512MB, Egoman (Red Pi, Blue Pi?) - * 000e - Model B, Rev 1.2, 512MB, Sony - * 000f - Model B, Rev 1.2, 512MB, Egoman - * - * 0010 - Model B+, Rev 1.2, 512MB, Sony - * 0013 - Model B+ Rev 1.2, 512MB, Embest - * 0016 - Model B+ Rev 1.2, 512MB, Sony - * 0019 - Model B+ Rev 1.2, 512MB, Egoman - * - * 0011 - Pi CM, Rev 1.1, 512MB, Sony - * 0014 - Pi CM, Rev 1.1, 512MB, Embest - * 0017 - Pi CM, Rev 1.1, 512MB, Sony - * 001a - Pi CM, Rev 1.1, 512MB, Egoman - * - * 0012 - Model A+ Rev 1.1, 256MB, Sony - * 0015 - Model A+ Rev 1.1, 512MB, Embest - * 0018 - Model A+ Rev 1.1, 256MB, Sony - * 001b - Model A+ Rev 1.1, 256MB, Egoman - * - * A small thorn is the olde style overvolting - that will add in - * 1000000 - * - * The Pi compute module has an revision of 0011 or 0014 - since we only - * check the last digit, then it's 1, therefore it'll default to not 2 or - * 3 for a Rev 1, so will appear as a Rev 2. This is fine for the most part, but - * we'll properly detect the Compute Module later and adjust accordingly. - * - * And then things changed with the introduction of the v2... - * - * For Pi v2 and subsequent models - e.g. the Zero: - * - * [USER:8] [NEW:1] [MEMSIZE:3] [MANUFACTURER:4] [PROCESSOR:4] [TYPE:8] [REV:4] - * NEW 23: will be 1 for the new scheme, 0 for the old scheme - * MEMSIZE 20: 0=256M 1=512M 2=1G - * MANUFACTURER 16: 0=SONY 1=EGOMAN 2=EMBEST - * PROCESSOR 12: 0=2835 1=2836 - * TYPE 04: 0=MODELA 1=MODELB 2=MODELA+ 3=MODELB+ 4=Pi2 MODEL B 5=ALPHA 6=CM - * REV 00: 0=REV0 1=REV1 2=REV2 - ********************************************************************************* - */ - -void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) -{ - FILE *cpuFd ; - char line [120] ; - char *c ; - unsigned int revision ; - int bRev, bType, bProc, bMfg, bMem, bWarranty ; - -// Will deal with the properly later on - for now, lets just get it going... -// unsigned int modelNum ; - - (void)piGpioLayout () ; // Call this first to make sure all's OK. Don't care about the result. - - if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) - piGpioLayoutOops ("Unable to open /proc/cpuinfo") ; - - while (fgets (line, 120, cpuFd) != NULL) - if (strncmp (line, "Revision", 8) == 0) - break ; - - fclose (cpuFd) ; - - if (strncmp (line, "Revision", 8) != 0) - piGpioLayoutOops ("No \"Revision\" line") ; - -// Chomp trailing CR/NL - - for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) - *c = 0 ; - - if (wiringPiDebug) - printf ("piBoardId: Revision string: %s\n", line) ; - -// Need to work out if it's using the new or old encoding scheme: - -// Scan to the first character of the revision number - - for (c = line ; *c ; ++c) - if (*c == ':') - break ; - - if (*c != ':') - piGpioLayoutOops ("Bogus \"Revision\" line (no colon)") ; - -// Chomp spaces - - ++c ; - while (isspace (*c)) - ++c ; - - if (!isxdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)") ; - - revision = (unsigned int)strtol (c, NULL, 16) ; // Hex number with no leading 0x - -// Check for new way: - - if ((revision & (1 << 23)) != 0) // New way - { - if (wiringPiDebug) - printf ("piBoardId: New Way: revision is: 0x%08X\n", revision) ; - - bRev = (revision & (0x0F << 0)) >> 0 ; - bType = (revision & (0xFF << 4)) >> 4 ; - bProc = (revision & (0x0F << 12)) >> 12 ; // Not used for now. - bMfg = (revision & (0x0F << 16)) >> 16 ; - bMem = (revision & (0x07 << 20)) >> 20 ; - bWarranty = (revision & (0x03 << 24)) != 0 ; - - *model = bType ; - *rev = bRev ; - *mem = bMem ; - *maker = bMfg ; - *warranty = bWarranty ; - - if (wiringPiDebug) - printf ("piBoardId: rev: %d, type: %d, proc: %d, mfg: %d, mem: %d, warranty: %d\n", - bRev, bType, bProc, bMfg, bMem, bWarranty) ; - } - else // Old way - { - if (wiringPiDebug) - printf ("piBoardId: Old Way: revision is: %s\n", c) ; - - if (!isdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no digit at start of revision)") ; - -// Make sure its long enough - - if (strlen (c) < 4) - piGpioLayoutOops ("Bogus \"Revision\" line (not long enough)") ; - -// If longer than 4, we'll assume it's been overvolted - - *warranty = strlen (c) > 4 ; - -// Extract last 4 characters: - - c = c + strlen (c) - 4 ; - -// Fill out the replys as appropriate - - /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; ; } - else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0016") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0019") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0014") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0017") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "001a") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0015") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0018") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "001b") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; } - } -} - - - -/* - * wpiPinToGpio: - * Translate a wiringPi Pin number to native GPIO pin number. - * Provided for external support. - ********************************************************************************* - */ - -int wpiPinToGpio (int wpiPin) -{ - return pinToGpio [wpiPin & 63] ; -} - - -/* - * physPinToGpio: - * Translate a physical Pin number to native GPIO pin number. - * Provided for external support. - ********************************************************************************* - */ - -int physPinToGpio (int physPin) -{ - return physToGpio [physPin & 63] ; -} - - -/* - * setPadDrive: - * Set the PAD driver value - ********************************************************************************* - */ - -void setPadDrive (int group, int value) -{ - uint32_t wrVal ; - - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - if ((group < 0) || (group > 2)) - return ; - - wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; - *(pads + group + 11) = wrVal ; - - if (wiringPiDebug) - { - printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; - printf ("Read : %08X\n", *(pads + group + 11)) ; - } - } -} - - -/* - * getAlt: - * Returns the ALT bits for a given port. Only really of-use - * for the gpio readall command (I think) - ********************************************************************************* - */ - -int getAlt (int pin) -{ - int fSel, shift, alt ; - - pin &= 63 ; - - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return 0 ; - - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; - - alt = (*(gpio + fSel) >> shift) & 7 ; - - return alt ; -} - - -/* - * pwmSetMode: - * Select the native "balanced" mode, or standard mark:space mode - ********************************************************************************* - */ - -void pwmSetMode (int mode) -{ - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - if (mode == PWM_MODE_MS) - *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ; - else - *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; - } -} - - -/* - * pwmSetRange: - * Set the PWM range register. We set both range registers to the same - * value. If you want different in your own code, then write your own. - ********************************************************************************* - */ - -void pwmSetRange (unsigned int range) -{ - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ; - *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ; - } -} - - -/* - * pwmSetClock: - * Set/Change the PWM clock. Originally my code, but changed - * (for the better!) by Chris Hall, - * after further study of the manual and testing with a 'scope - ********************************************************************************* - */ - -void pwmSetClock (int divisor) -{ - uint32_t pwm_control ; - divisor &= 4095 ; - - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - if (wiringPiDebug) - printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; - - pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL - -// We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY -// stays high. - - *(pwm + PWM_CONTROL) = 0 ; // Stop PWM - -// Stop PWM clock before changing divisor. The delay after this does need to -// this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY -// flag is not working properly in balanced mode. Without the delay when DIV is -// adjusted the clock sometimes switches to very slow, once slow further DIV -// adjustments do nothing and it's difficult to get out of this mode. - - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock - delayMicroseconds (110) ; // prevents clock going sloooow - - while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY - delayMicroseconds (1) ; - - *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ; - - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock - *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL - - if (wiringPiDebug) - printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; - } -} - - -/* - * gpioClockSet: - * Set the freuency on a GPIO clock pin - ********************************************************************************* - */ - -void gpioClockSet (int pin, int freq) -{ - int divi, divr, divf ; - - pin &= 63 ; - - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - divi = 19200000 / freq ; - divr = 19200000 % freq ; - divf = (int)((double)divr * 4096.0 / 19200000.0) ; - - if (divi > 4095) - divi = 4095 ; - - *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock - while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait - ; - - *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers - *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock -} - - -/* - * wiringPiFindNode: - * Locate our device node - ********************************************************************************* - */ - -struct wiringPiNodeStruct *wiringPiFindNode (int pin) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - while (node != NULL) - if ((pin >= node->pinBase) && (pin <= node->pinMax)) - return node ; - else - node = node->next ; - - return NULL ; -} - - -/* - * wiringPiNewNode: - * Create a new GPIO node into the wiringPi handling system - ********************************************************************************* - */ - -static void pinModeDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int mode) { return ; } -static void pullUpDnControlDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int pud) { return ; } -static unsigned int digitalRead8Dummy (UNU struct wiringPiNodeStruct *node, UNU int UNU pin) { return 0 ; } -static void digitalWrite8Dummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static int digitalReadDummy (UNU struct wiringPiNodeStruct *node, UNU int UNU pin) { return LOW ; } -static void digitalWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static void pwmWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static int analogReadDummy (UNU struct wiringPiNodeStruct *node, UNU int pin) { return 0 ; } -static void analogWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } - -struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) -{ - int pin ; - struct wiringPiNodeStruct *node ; - -// Minimum pin base is 64 - - if (pinBase < 64) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ; - -// Check all pins in-case there is overlap: - - for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin) - if (wiringPiFindNode (pin) != NULL) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ; - - node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros - if (node == NULL) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ; - - node->pinBase = pinBase ; - node->pinMax = pinBase + numPins - 1 ; - node->pinMode = pinModeDummy ; - node->pullUpDnControl = pullUpDnControlDummy ; - node->digitalRead = digitalReadDummy ; -//node->digitalRead8 = digitalRead8Dummy ; - node->digitalWrite = digitalWriteDummy ; -//node->digitalWrite8 = digitalWrite8Dummy ; - node->pwmWrite = pwmWriteDummy ; - node->analogRead = analogReadDummy ; - node->analogWrite = analogWriteDummy ; - node->next = wiringPiNodes ; - wiringPiNodes = node ; - - return node ; -} - - -#ifdef notYetReady -/* - * pinED01: - * pinED10: - * Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0 - * Pin must already be in input mode with appropriate pull up/downs set. - ********************************************************************************* - */ - -void pinEnableED01Pi (int pin) -{ - pin = pinToGpio [pin & 63] ; -} -#endif - - -/* - ********************************************************************************* - * Core Functions - ********************************************************************************* - */ - -/* - * pinModeAlt: - * This is an un-documented special to let you set any pin to any mode - ********************************************************************************* - */ - -void pinModeAlt (int pin, int mode) -{ - int fSel, shift ; - - if ((pin & PI_GPIO_MASK) == 0) // On-board pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ; - } -} - - -/* - * pinMode: - * Sets the mode of a pin to be input, output or PWM output - ********************************************************************************* - */ - -void pinMode (int pin, int mode) -{ - int fSel, shift, alt ; - struct wiringPiNodeStruct *node = wiringPiNodes ; - int origPin = pin ; - - if ((pin & PI_GPIO_MASK) == 0) // On-board pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - softPwmStop (origPin) ; - softToneStop (origPin) ; - - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; - - /**/ if (mode == INPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input - else if (mode == OUTPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ; - else if (mode == SOFT_PWM_OUTPUT) - softPwmCreate (origPin, 0, 100) ; - else if (mode == SOFT_TONE_OUTPUT) - softToneCreate (origPin) ; - else if (mode == PWM_TONE_OUTPUT) - { - pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode - pwmSetMode (PWM_MODE_MS) ; - } - else if (mode == PWM_OUTPUT) - { - if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin - return ; - -// Set pin to PWM mode - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - delayMicroseconds (110) ; // See comments in pwmSetClockWPi - - pwmSetMode (PWM_MODE_BAL) ; // Pi default mode - pwmSetRange (1024) ; // Default range of 1024 - pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM - } - else if (mode == GPIO_CLOCK) - { - if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin - return ; - -// Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - delayMicroseconds (110) ; - gpioClockSet (pin, 100000) ; - } - } - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->pinMode (node, pin, mode) ; - return ; - } -} - - -/* - * pullUpDownCtrl: - * Control the internal pull-up/down resistors on a GPIO pin - * The Arduino only has pull-ups and these are enabled by writing 1 - * to a port when in input mode - this paradigm doesn't quite apply - * here though. - ********************************************************************************* - */ - -void pullUpDnControl (int pin, int pud) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ; - *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ; - - *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ; - *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ; - } - else // Extension module - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->pullUpDnControl (node, pin, pud) ; - return ; - } -} - - -/* - * digitalRead: - * Read the value of a given Pin, returning HIGH or LOW - ********************************************************************************* - */ - -int digitalRead (int pin) -{ - char c ; - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode - { - if (sysFds [pin] == -1) - return LOW ; - - lseek (sysFds [pin], 0L, SEEK_SET) ; - read (sysFds [pin], &c, 1) ; - return (c == '0') ? LOW : HIGH ; - } - else if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return LOW ; - - if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0) - return HIGH ; - else - return LOW ; - } - else - { - if ((node = wiringPiFindNode (pin)) == NULL) - return LOW ; - return node->digitalRead (node, pin) ; - } -} - - -/* - * digitalRead8: - * Read 8-bits (a byte) from given start pin. - ********************************************************************************* - -unsigned int digitalRead8 (int pin) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - return 0 ; - else - { - if ((node = wiringPiFindNode (pin)) == NULL) - return LOW ; - return node->digitalRead8 (node, pin) ; - } -} - */ - - -/* - * digitalWrite: - * Set an output bit - ********************************************************************************* - */ - -void digitalWrite (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode - { - if (sysFds [pin] != -1) - { - if (value == LOW) - write (sysFds [pin], "0\n", 2) ; - else - write (sysFds [pin], "1\n", 2) ; - } - return ; - } - else if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - if (value == LOW) - *(gpio + gpioToGPCLR [pin]) = 1 << (pin & 31) ; - else - *(gpio + gpioToGPSET [pin]) = 1 << (pin & 31) ; - } - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->digitalWrite (node, pin, value) ; - } -} - - -/* - * digitalWrite8: - * Set an output 8-bit byte on the device from the given pin number - ********************************************************************************* - -void digitalWrite8 (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - return ; - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->digitalWrite8 (node, pin, value) ; - } -} - */ - - -/* - * pwmWrite: - * Set an output PWM value - ********************************************************************************* - */ - -void pwmWrite (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - *(pwm + gpioToPwmPort [pin]) = value ; - } - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->pwmWrite (node, pin, value) ; - } -} - - -/* - * analogRead: - * Read the analog value of a given Pin. - * There is no on-board Pi analog hardware, - * so this needs to go to a new node. - ********************************************************************************* - */ - -int analogRead (int pin) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((node = wiringPiFindNode (pin)) == NULL) - return 0 ; - else - return node->analogRead (node, pin) ; -} - - -/* - * analogWrite: - * Write the analog value to the given Pin. - * There is no on-board Pi analog hardware, - * so this needs to go to a new node. - ********************************************************************************* - */ - -void analogWrite (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((node = wiringPiFindNode (pin)) == NULL) - return ; - - node->analogWrite (node, pin, value) ; -} - - -/* - * pwmToneWrite: - * Pi Specific. - * Output the given frequency on the Pi's PWM pin - ********************************************************************************* - */ - -void pwmToneWrite (int pin, int freq) -{ - int range ; - - if (freq == 0) - pwmWrite (pin, 0) ; // Off - else - { - range = 600000 / freq ; - pwmSetRange (range) ; - pwmWrite (pin, freq / 2) ; - } -} - - - -/* - * digitalWriteByte: - * digitalReadByte: - * Pi Specific - * Write an 8-bit byte to the first 8 GPIO pins - try to do it as - * fast as possible. - * However it still needs 2 operations to set the bits, so any external - * hardware must not rely on seeing a change as there will be a change - * to set the outputs bits to zero, then another change to set the 1's - * Reading is just bit fiddling. - * These are wiringPi pin numbers 0..7, or BCM_GPIO pin numbers - * 17, 18, 22, 23, 24, 24, 4 on a Pi v1 rev 0-3 - * 17, 18, 27, 23, 24, 24, 4 on a Pi v1 rev 3 onwards or B+, 2, 3, zero - ********************************************************************************* - */ - -void digitalWriteByte (const int value) -{ - uint32_t pinSet = 0 ; - uint32_t pinClr = 0 ; - int mask = 1 ; - int pin ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 0 ; pin < 8 ; ++pin) - { - digitalWrite (pinToGpio [pin], value & mask) ; - mask <<= 1 ; - } - return ; - } - else - { - for (pin = 0 ; pin < 8 ; ++pin) - { - if ((value & mask) == 0) - pinClr |= (1 << pinToGpio [pin]) ; - else - pinSet |= (1 << pinToGpio [pin]) ; - - mask <<= 1 ; - } - - *(gpio + gpioToGPCLR [0]) = pinClr ; - *(gpio + gpioToGPSET [0]) = pinSet ; - } -} - -unsigned int digitalReadByte (void) -{ - int pin, x ; - uint32_t raw ; - uint32_t data = 0 ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 0 ; pin < 8 ; ++pin) - { - x = digitalRead (pinToGpio [pin]) ; - data = (data << 1) | x ; - } - } - else - { - raw = *(gpio + gpioToGPLEV [0]) ; // First bank for these pins - for (pin = 0 ; pin < 8 ; ++pin) - { - x = pinToGpio [pin] ; - data = (data << 1) | (((raw & (1 << x)) == 0) ? 0 : 1) ; - } - } - return data ; -} - - -/* - * digitalWriteByte2: - * digitalReadByte2: - * Pi Specific - * Write an 8-bit byte to the second set of 8 GPIO pins. This is marginally - * faster than the first lot as these are consecutive BCM_GPIO pin numbers. - * However they overlap with the original read/write bytes. - ********************************************************************************* - */ - -void digitalWriteByte2 (const int value) -{ - register int mask = 1 ; - register int pin ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 20 ; pin < 28 ; ++pin) - { - digitalWrite (pin, value & mask) ; - mask <<= 1 ; - } - return ; - } - else - { - *(gpio + gpioToGPCLR [0]) = (~value & 0xFF) << 20 ; // 0x0FF00000; ILJ > CHANGE: Old causes glitch - *(gpio + gpioToGPSET [0]) = ( value & 0xFF) << 20 ; - } -} - -unsigned int digitalReadByte2 (void) -{ - int pin, x ; - uint32_t data = 0 ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 20 ; pin < 28 ; ++pin) - { - x = digitalRead (pin) ; - data = (data << 1) | x ; - } - } - else - data = ((*(gpio + gpioToGPLEV [0])) >> 20) & 0xFF ; // First bank for these pins - - return data ; -} - - -/* - * waitForInterrupt: - * Pi Specific. - * Wait for Interrupt on a GPIO pin. - * This is actually done via the /sys/class/gpio interface regardless of - * the wiringPi access mode in-use. Maybe sometime it might get a better - * way for a bit more efficiency. - ********************************************************************************* - */ - -int waitForInterrupt (int pin, int mS) -{ - int fd, x ; - uint8_t c ; - struct pollfd polls ; - - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - - if ((fd = sysFds [pin]) == -1) - return -2 ; - -// Setup poll structure - - polls.fd = fd ; - polls.events = POLLPRI | POLLERR ; - -// Wait for it ... - - x = poll (&polls, 1, mS) ; - -// If no error, do a dummy read to clear the interrupt -// A one character read appars to be enough. - - if (x > 0) - { - lseek (fd, 0, SEEK_SET) ; // Rewind - (void)read (fd, &c, 1) ; // Read & clear - } - - return x ; -} - - -/* - * interruptHandler: - * This is a thread and gets started to wait for the interrupt we're - * hoping to catch. It will call the user-function when the interrupt - * fires. - ********************************************************************************* - */ - -static void *interruptHandler (UNU void *arg) -{ - int myPin ; - - (void)piHiPri (55) ; // Only effective if we run as root - - myPin = pinPass ; - pinPass = -1 ; - - for (;;) - if (waitForInterrupt (myPin, -1) > 0) - isrFunctions [myPin] () ; - - return NULL ; -} - - -/* - * wiringPiISR: - * Pi Specific. - * Take the details and create an interrupt handler that will do a call- - * back to the user supplied function. - ********************************************************************************* - */ - -int wiringPiISR (int pin, int mode, void (*function)(void)) -{ - pthread_t threadId ; - const char *modeS ; - char fName [64] ; - char pinS [8] ; - pid_t pid ; - int count, i ; - char c ; - int bcmGpioPin ; - - if ((pin < 0) || (pin > 63)) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ; - - /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ; - else if (wiringPiMode == WPI_MODE_PINS) - bcmGpioPin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - bcmGpioPin = physToGpio [pin] ; - else - bcmGpioPin = pin ; - -// Now export the pin and set the right edge -// We're going to use the gpio program to do this, so it assumes -// a full installation of wiringPi. It's a bit 'clunky', but it -// is a way that will work when we're running in "Sys" mode, as -// a non-root user. (without sudo) - - if (mode != INT_EDGE_SETUP) - { - /**/ if (mode == INT_EDGE_FALLING) - modeS = "falling" ; - else if (mode == INT_EDGE_RISING) - modeS = "rising" ; - else - modeS = "both" ; - - sprintf (pinS, "%d", bcmGpioPin) ; - - if ((pid = fork ()) < 0) // Fail - return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ; - - if (pid == 0) // Child, exec - { - /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0) - { - execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; - return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; - } - else if (access ("/usr/bin/gpio", X_OK) == 0) - { - execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; - return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; - } - else - return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ; - } - else // Parent, wait - wait (NULL) ; - } - -// Now pre-open the /sys/class node - but it may already be open if -// we are in Sys mode... - - if (sysFds [bcmGpioPin] == -1) - { - sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; - if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ; - } - -// Clear any initial pending interrupt - - ioctl (sysFds [bcmGpioPin], FIONREAD, &count) ; - for (i = 0 ; i < count ; ++i) - read (sysFds [bcmGpioPin], &c, 1) ; - - isrFunctions [pin] = function ; - - pthread_mutex_lock (&pinMutex) ; - pinPass = pin ; - pthread_create (&threadId, NULL, interruptHandler, NULL) ; - while (pinPass != -1) - delay (1) ; - pthread_mutex_unlock (&pinMutex) ; - - return 0 ; -} - - -/* - * initialiseEpoch: - * Initialise our start-of-time variable to be the current unix - * time in milliseconds and microseconds. - ********************************************************************************* - */ - -static void initialiseEpoch (void) -{ -#ifdef OLD_WAY - struct timeval tv ; - - gettimeofday (&tv, NULL) ; - epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; - epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ; -#else - struct timespec ts ; - - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - epochMilli = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L) ; - epochMicro = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000L) ; -#endif -} - - -/* - * delay: - * Wait for some number of milliseconds - ********************************************************************************* - */ - -void delay (unsigned int howLong) -{ - struct timespec sleeper, dummy ; - - sleeper.tv_sec = (time_t)(howLong / 1000) ; - sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ; - - nanosleep (&sleeper, &dummy) ; -} - - -/* - * delayMicroseconds: - * This is somewhat intersting. It seems that on the Pi, a single call - * to nanosleep takes some 80 to 130 microseconds anyway, so while - * obeying the standards (may take longer), it's not always what we - * want! - * - * So what I'll do now is if the delay is less than 100uS we'll do it - * in a hard loop, watching a built-in counter on the ARM chip. This is - * somewhat sub-optimal in that it uses 100% CPU, something not an issue - * in a microcontroller, but under a multi-tasking, multi-user OS, it's - * wastefull, however we've no real choice )-: - * - * Plan B: It seems all might not be well with that plan, so changing it - * to use gettimeofday () and poll on that instead... - ********************************************************************************* - */ - -void delayMicrosecondsHard (unsigned int howLong) -{ - struct timeval tNow, tLong, tEnd ; - - gettimeofday (&tNow, NULL) ; - tLong.tv_sec = howLong / 1000000 ; - tLong.tv_usec = howLong % 1000000 ; - timeradd (&tNow, &tLong, &tEnd) ; - - while (timercmp (&tNow, &tEnd, <)) - gettimeofday (&tNow, NULL) ; -} - -void delayMicroseconds (unsigned int howLong) -{ - struct timespec sleeper ; - unsigned int uSecs = howLong % 1000000 ; - unsigned int wSecs = howLong / 1000000 ; - - /**/ if (howLong == 0) - return ; - else if (howLong < 100) - delayMicrosecondsHard (howLong) ; - else - { - sleeper.tv_sec = wSecs ; - sleeper.tv_nsec = (long)(uSecs * 1000L) ; - nanosleep (&sleeper, NULL) ; - } -} - - -/* - * millis: - * Return a number of milliseconds as an unsigned int. - * Wraps at 49 days. - ********************************************************************************* - */ - -unsigned int millis (void) -{ - uint64_t now ; - -#ifdef OLD_WAY - struct timeval tv ; - - gettimeofday (&tv, NULL) ; - now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; - -#else - struct timespec ts ; - - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - now = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L) ; -#endif - - return (uint32_t)(now - epochMilli) ; -} - - -/* - * micros: - * Return a number of microseconds as an unsigned int. - * Wraps after 71 minutes. - ********************************************************************************* - */ - -unsigned int micros (void) -{ - uint64_t now ; -#ifdef OLD_WAY - struct timeval tv ; - - gettimeofday (&tv, NULL) ; - now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ; -#else - struct timespec ts ; - - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - now = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000) ; -#endif - - - return (uint32_t)(now - epochMicro) ; -} - -/* - * wiringPiVersion: - * Return our current version number - ********************************************************************************* - */ - -void wiringPiVersion (int *major, int *minor) -{ - *major = VERSION_MAJOR ; - *minor = VERSION_MINOR ; -} - - -/* - * wiringPiSetup: - * Must be called once at the start of your program execution. - * - * Default setup: Initialises the system into wiringPi Pin mode and uses the - * memory mapped hardware directly. - * - * Changed now to revert to "gpio" mode if we're running on a Compute Module. - ********************************************************************************* - */ - -int wiringPiSetup (void) -{ - int fd ; - int model, rev, mem, maker, overVolted ; - static int alreadyDoneThis = FALSE ; - -// It's actually a fatal error to call any of the wiringPiSetup routines more than once, -// (you run out of file handles!) but I'm fed-up with the useless twats who email -// me bleating that there is a bug in my code, so screw-em. - - if (alreadyDoneThis) - return 0 ; - - alreadyDoneThis = TRUE ; - - if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; - - if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetup called\n") ; - -// Get the board ID information. We're not really using the information here, -// but it will give us information like the GPIO layout scheme (2 variants -// on the older 26-pin Pi's) and the GPIO peripheral base address. -// and if we're running on a compute module, then wiringPi pin numbers -// don't really many anything, so force native BCM mode anyway. - - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - - if ((model == PI_MODEL_CM) || (model == PI_MODEL_CM3)) - wiringPiMode = WPI_MODE_GPIO ; - else - wiringPiMode = WPI_MODE_PINS ; - - /**/ if (piGpioLayout () == 1) // A, B, Rev 1, 1.1 - { - pinToGpio = pinToGpioR1 ; - physToGpio = physToGpioR1 ; - } - else // A2, B2, A+, B+, CM, Pi2, Pi3, Zero - { - pinToGpio = pinToGpioR2 ; - physToGpio = physToGpioR2 ; - } - -// ... - - switch (model) - { - case PI_MODEL_A: case PI_MODEL_B: - case PI_MODEL_AP: case PI_MODEL_BP: - case PI_ALPHA: case PI_MODEL_CM: - case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: - piGpioBase = GPIO_PERI_BASE_OLD ; - break ; - - default: - piGpioBase = GPIO_PERI_BASE_NEW ; - break ; - } - -// Open the master /dev/ memory control device -// Device strategy: December 2016: -// Try /dev/mem. If that fails, then -// try /dev/gpiomem. If that fails then game over. - - if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) - { - if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem: %s.\n Try running with sudo?\n", strerror (errno)) ; - piGpioBase = 0 ; - } - -// Set the offsets into the memory interface. - - GPIO_PADS = piGpioBase + 0x00100000 ; - GPIO_CLOCK_BASE = piGpioBase + 0x00101000 ; - GPIO_BASE = piGpioBase + 0x00200000 ; - GPIO_TIMER = piGpioBase + 0x0000B000 ; - GPIO_PWM = piGpioBase + 0x0020C000 ; - -// Map the individual hardware components - -// GPIO: - - gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ; - if (gpio == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; - -// PWM - - pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ; - if (pwm == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ; - -// Clock control (needed for PWM) - - clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_CLOCK_BASE) ; - if (clk == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ; - -// The drive pads - - pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ; - if (pads == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ; - -#ifdef USE_TIMER -// The system timer - - timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ; - if (timer == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ; - -// Set the timer to free-running, 1MHz. -// 0xF9 is 249, the timer divide is base clock / (divide+1) -// so base clock is 250MHz / 250 = 1MHz. - - *(timer + TIMER_CONTROL) = 0x0000280 ; - *(timer + TIMER_PRE_DIV) = 0x00000F9 ; - timerIrqRaw = timer + TIMER_IRQ_RAW ; -#endif - - initialiseEpoch () ; - - return 0 ; -} - - -/* - * wiringPiSetupGpio: - * Must be called once at the start of your program execution. - * - * GPIO setup: Initialises the system into GPIO Pin mode and uses the - * memory mapped hardware directly. - ********************************************************************************* - */ - -int wiringPiSetupGpio (void) -{ - (void)wiringPiSetup () ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupGpio called\n") ; - - wiringPiMode = WPI_MODE_GPIO ; - - return 0 ; -} - - -/* - * wiringPiSetupPhys: - * Must be called once at the start of your program execution. - * - * Phys setup: Initialises the system into Physical Pin mode and uses the - * memory mapped hardware directly. - ********************************************************************************* - */ - -int wiringPiSetupPhys (void) -{ - (void)wiringPiSetup () ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupPhys called\n") ; - - wiringPiMode = WPI_MODE_PHYS ; - - return 0 ; -} - - -/* - * wiringPiSetupSys: - * Must be called once at the start of your program execution. - * - * Initialisation (again), however this time we are using the /sys/class/gpio - * interface to the GPIO systems - slightly slower, but always usable as - * a non-root user, assuming the devices are already exported and setup correctly. - */ - -int wiringPiSetupSys (void) -{ - int pin ; - char fName [128] ; - - static int alreadyDoneThis = FALSE ; - -// It's actually a fatal error to call any of the wiringPiSetup routines more than once, -// (you run out of file handles!) but I'm fed-up with the useless twats who email -// me bleating that there is a bug in my code, so screw-em. - - if (alreadyDoneThis) - return 0 ; - - alreadyDoneThis = TRUE ; - - if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; - - if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupSys called\n") ; - - if (piGpioLayout () == 1) - { - pinToGpio = pinToGpioR1 ; - physToGpio = physToGpioR1 ; - } - else - { - pinToGpio = pinToGpioR2 ; - physToGpio = physToGpioR2 ; - } - -// Open and scan the directory, looking for exported GPIOs, and pre-open -// the 'value' interface to speed things up for later - - for (pin = 0 ; pin < 64 ; ++pin) - { - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - sysFds [pin] = open (fName, O_RDWR) ; - } - - initialiseEpoch () ; - - wiringPiMode = WPI_MODE_GPIO_SYS ; - - return 0 ; -} diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h deleted file mode 100644 index f601f13..0000000 --- a/wiringPi/wiringPi.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * wiringPi.h: - * Arduino like Wiring library for the Raspberry Pi. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#ifndef __WIRING_PI_H__ -#define __WIRING_PI_H__ - -// C doesn't have true/false by default and I can never remember which -// way round they are, so ... -// (and yes, I know about stdbool.h but I like capitals for these and I'm old) - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) -#endif - -// GCC warning suppressor - -#define UNU __attribute__((unused)) - -// Mask for the bottom 64 pins which belong to the Raspberry Pi -// The others are available for the other devices - -#define PI_GPIO_MASK (0xFFFFFFC0) - -// Handy defines - -// wiringPi modes - -#define WPI_MODE_PINS 0 -#define WPI_MODE_GPIO 1 -#define WPI_MODE_GPIO_SYS 2 -#define WPI_MODE_PHYS 3 -#define WPI_MODE_PIFACE 4 -#define WPI_MODE_UNINITIALISED -1 - -// Pin modes - -#define INPUT 0 -#define OUTPUT 1 -#define PWM_OUTPUT 2 -#define GPIO_CLOCK 3 -#define SOFT_PWM_OUTPUT 4 -#define SOFT_TONE_OUTPUT 5 -#define PWM_TONE_OUTPUT 6 - -#define LOW 0 -#define HIGH 1 - -// Pull up/down/none - -#define PUD_OFF 0 -#define PUD_DOWN 1 -#define PUD_UP 2 - -// PWM - -#define PWM_MODE_MS 0 -#define PWM_MODE_BAL 1 - -// Interrupt levels - -#define INT_EDGE_SETUP 0 -#define INT_EDGE_FALLING 1 -#define INT_EDGE_RISING 2 -#define INT_EDGE_BOTH 3 - -// Pi model types and version numbers -// Intended for the GPIO program Use at your own risk. - -#define PI_MODEL_A 0 -#define PI_MODEL_B 1 -#define PI_MODEL_AP 2 -#define PI_MODEL_BP 3 -#define PI_MODEL_2 4 -#define PI_ALPHA 5 -#define PI_MODEL_CM 6 -#define PI_MODEL_07 7 -#define PI_MODEL_3 8 -#define PI_MODEL_ZERO 9 -#define PI_MODEL_CM3 10 -#define PI_MODEL_ZERO_W 12 - -#define PI_VERSION_1 0 -#define PI_VERSION_1_1 1 -#define PI_VERSION_1_2 2 -#define PI_VERSION_2 3 - -#define PI_MAKER_SONY 0 -#define PI_MAKER_EGOMAN 1 -#define PI_MAKER_EMBEST 2 -#define PI_MAKER_UNKNOWN 3 - -extern const char *piModelNames [16] ; -extern const char *piRevisionNames [16] ; -extern const char *piMakerNames [16] ; -extern const int piMemorySize [ 8] ; - - -// Intended for the GPIO program Use at your own risk. - -// Threads - -#define PI_THREAD(X) void *X (UNU void *dummy) - -// Failure modes - -#define WPI_FATAL (1==1) -#define WPI_ALMOST (1==2) - - -// wiringPiNodeStruct: -// This describes additional device nodes in the extended wiringPi -// 2.0 scheme of things. -// It's a simple linked list for now, but will hopefully migrate to -// a binary tree for efficiency reasons - but then again, the chances -// of more than 1 or 2 devices being added are fairly slim, so who -// knows.... - -struct wiringPiNodeStruct -{ - int pinBase ; - int pinMax ; - - int fd ; // Node specific - unsigned int data0 ; // ditto - unsigned int data1 ; // ditto - unsigned int data2 ; // ditto - unsigned int data3 ; // ditto - - void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode) ; - void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode) ; - int (*digitalRead) (struct wiringPiNodeStruct *node, int pin) ; -//unsigned int (*digitalRead8) (struct wiringPiNodeStruct *node, int pin) ; - void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; -// void (*digitalWrite8) (struct wiringPiNodeStruct *node, int pin, int value) ; - void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; - int (*analogRead) (struct wiringPiNodeStruct *node, int pin) ; - void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; - - struct wiringPiNodeStruct *next ; -} ; - -extern struct wiringPiNodeStruct *wiringPiNodes ; - - -// Function prototypes -// c++ wrappers thanks to a comment by Nick Lott -// (and others on the Raspberry Pi forums) - -#ifdef __cplusplus -extern "C" { -#endif - -// Data - -// Internal - -extern int wiringPiFailure (int fatal, const char *message, ...) ; - -// Core wiringPi functions - -extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ; -extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; - -extern void wiringPiVersion (int *major, int *minor) ; -extern int wiringPiSetup (void) ; -extern int wiringPiSetupSys (void) ; -extern int wiringPiSetupGpio (void) ; -extern int wiringPiSetupPhys (void) ; - -extern void pinModeAlt (int pin, int mode) ; -extern void pinMode (int pin, int mode) ; -extern void pullUpDnControl (int pin, int pud) ; -extern int digitalRead (int pin) ; -extern void digitalWrite (int pin, int value) ; -extern unsigned int digitalRead8 (int pin) ; -extern void digitalWrite8 (int pin, int value) ; -extern void pwmWrite (int pin, int value) ; -extern int analogRead (int pin) ; -extern void analogWrite (int pin, int value) ; - -// PiFace specifics -// (Deprecated) - -extern int wiringPiSetupPiFace (void) ; -extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio program only - -// On-Board Raspberry Pi hardware specific stuff - -extern int piGpioLayout (void) ; -extern int piBoardRev (void) ; // Deprecated -extern void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) ; -extern int wpiPinToGpio (int wpiPin) ; -extern int physPinToGpio (int physPin) ; -extern void setPadDrive (int group, int value) ; -extern int getAlt (int pin) ; -extern void pwmToneWrite (int pin, int freq) ; -extern void pwmSetMode (int mode) ; -extern void pwmSetRange (unsigned int range) ; -extern void pwmSetClock (int divisor) ; -extern void gpioClockSet (int pin, int freq) ; -extern unsigned int digitalReadByte (void) ; -extern unsigned int digitalReadByte2 (void) ; -extern void digitalWriteByte (int value) ; -extern void digitalWriteByte2 (int value) ; - -// Interrupts -// (Also Pi hardware specific) - -extern int waitForInterrupt (int pin, int mS) ; -extern int wiringPiISR (int pin, int mode, void (*function)(void)) ; - -// Threads - -extern int piThreadCreate (void *(*fn)(void *)) ; -extern void piLock (int key) ; -extern void piUnlock (int key) ; - -// Schedulling priority - -extern int piHiPri (const int pri) ; - -// Extras from arduino land - -extern void delay (unsigned int howLong) ; -extern void delayMicroseconds (unsigned int howLong) ; -extern unsigned int millis (void) ; -extern unsigned int micros (void) ; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h new file mode 120000 index 0000000..ef688ed --- /dev/null +++ b/wiringPi/wiringPi.h @@ -0,0 +1 @@ +wiringOdroid.h \ No newline at end of file diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h deleted file mode 100644 index 6db8c68..0000000 --- a/wiringPi/wiringPiI2C.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * wiringPiI2C.h: - * Simplified I2C access routines - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int wiringPiI2CRead (int fd) ; -extern int wiringPiI2CReadReg8 (int fd, int reg) ; -extern int wiringPiI2CReadReg16 (int fd, int reg) ; - -extern int wiringPiI2CWrite (int fd, int data) ; -extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; -extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; - -extern int wiringPiI2CSetupInterface (const char *device, int devId) ; -extern int wiringPiI2CSetup (const int devId) ; - -#ifdef __cplusplus -} -#endif diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h new file mode 120000 index 0000000..0c09f32 --- /dev/null +++ b/wiringPi/wiringPiI2C.h @@ -0,0 +1 @@ +wiringOdroidI2C.h \ No newline at end of file diff --git a/wiringPi/wiringPiSPI.h b/wiringPi/wiringPiSPI.h deleted file mode 100644 index 3980321..0000000 --- a/wiringPi/wiringPiSPI.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * wiringPiSPI.h: - * Simplified SPI access routines - * Copyright (c) 2012-2015 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -int wiringPiSPIGetFd (int channel) ; -int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; -int wiringPiSPISetupMode (int channel, int speed, int mode) ; -int wiringPiSPISetup (int channel, int speed) ; - -#ifdef __cplusplus -} -#endif diff --git a/wiringPi/wiringPiSPI.h b/wiringPi/wiringPiSPI.h new file mode 120000 index 0000000..92c384f --- /dev/null +++ b/wiringPi/wiringPiSPI.h @@ -0,0 +1 @@ +wiringOdroidSPI.h \ No newline at end of file diff --git a/wiringPi/wpiExtensions.c b/wiringPi/wpiExtensions.c index 53fafc0..0e82478 100644 --- a/wiringPi/wpiExtensions.c +++ b/wiringPi/wpiExtensions.c @@ -61,7 +61,6 @@ #include "bmp180.h" #include "htu21d.h" #include "ds18b20.h" -#include "rht03.h" #include "wpiExtensions.h" @@ -518,25 +517,6 @@ static int doExtensionDs18b20 (char *progName, int pinBase, char *params) return ds18b20Setup (pinBase, serialNum) ; } - -/* - * doExtensionRht03: - * Maxdetect 1-Wire Temperature & Humidity - * rht03:base:piPin - ********************************************************************************* - */ - -static int doExtensionRht03 (char *progName, int pinBase, char *params) -{ - int piPin ; - - if ((params = extractInt (progName, params, &piPin)) == NULL) - return FALSE ; - - return rht03Setup (pinBase, piPin) ; -} - - /* * doExtensionMax31855: * Analog IO @@ -843,7 +823,6 @@ static struct extensionFunctionStruct extensionFunctions [] = { "pseudoPins", &doExtensionPseudoPins }, { "htu21d", &doExtensionHtu21d }, { "ds18b20", &doExtensionDs18b20 }, - { "rht03", &doExtensionRht03 }, { "mcp3002", &doExtensionMcp3002 }, { "mcp3004", &doExtensionMcp3004 }, { "mcp4802", &doExtensionMcp4802 },