ODROID-N2:ODROID-N2 board wiringPi support.
Change-Id: I119c85723700739ff04e0f4144bc96ef854a5188
This commit is contained in:
@@ -222,6 +222,9 @@ static void doI2Cdetect (UNU int argc, char *argv [])
|
||||
device = "/dev/i2c-4";
|
||||
port = 4;
|
||||
break;
|
||||
case MODEL_ODROID_N2:
|
||||
device = "/dev/i2c-3";
|
||||
port = 3;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -259,6 +259,37 @@ static const char *physNamesOdroidN1 [64] =
|
||||
NULL,NULL,NULL,
|
||||
} ;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static const char *physNamesOdroidN2 [64] =
|
||||
{
|
||||
NULL,
|
||||
|
||||
" 3.3V", "5V ",
|
||||
" SDA.2", "5V ",
|
||||
" SCL.2", "GND(0V) ",
|
||||
"GPIO.473", "TxD1 ",
|
||||
" GND(0V)", "RxD1 ",
|
||||
"GPIO.479", "GPIO.492",
|
||||
"GPIO.480", "GND(0V) ",
|
||||
"GPIO.483", "GPIO.476",
|
||||
" 3.3V", "GPIO.477",
|
||||
" MOSI", "GND(0V) ",
|
||||
" MISO", "GPIO.478",
|
||||
" SCLK", "CE0 ",
|
||||
" GND(0V)", "GPIO.464",
|
||||
" SDA.3", "SCL.3 ",
|
||||
"GPIO.490", "GND(0V) ",
|
||||
"GPIO.491", "GPIO.472",
|
||||
"GPIO.481", "GND(0V) ",
|
||||
"GPIO.482", "GPIO.495",
|
||||
" AIN.3", "1V8 ",
|
||||
" GND(0V)", "AIN.2 ",
|
||||
|
||||
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
|
||||
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
|
||||
NULL,NULL,NULL,
|
||||
} ;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void readallPhysOdroid (int model, int rev, int physPin, const char *physNames[])
|
||||
{
|
||||
@@ -374,6 +405,10 @@ void doReadall (void)
|
||||
printf (" +------+-----+----------+------+ Model ODROID-N1 +------+----------+-----+------+\n") ;
|
||||
physNames = physNamesOdroidN1;
|
||||
break;
|
||||
case MODEL_ODROID_N2:
|
||||
printf (" +------+-----+----------+------+ Model ODROID-N2 +------+----------+-----+------+\n") ;
|
||||
physNames = physNamesOdroidN2;
|
||||
break;
|
||||
default:
|
||||
printf ("Oops - unable to determine board type... model: %d\n", model) ;
|
||||
return;
|
||||
|
||||
@@ -7,7 +7,8 @@ SRC = pins.tex \
|
||||
odroid_xu3.tex \
|
||||
odroid_c1.tex \
|
||||
odroid_c2.tex \
|
||||
odroid_n1.tex
|
||||
odroid_n1.tex \
|
||||
odroid_n2.tex
|
||||
|
||||
DVI = $(SRC:.tex=.dvi)
|
||||
|
||||
|
||||
99
pins/odroid_n2.tex
Executable file
99
pins/odroid_n2.tex
Executable file
@@ -0,0 +1,99 @@
|
||||
\documentclass[11pt,a4paper]{article}
|
||||
\parskip 1ex
|
||||
\parindent 0em
|
||||
\thispagestyle{empty}
|
||||
\pagestyle{plain}
|
||||
\pagenumbering{arabic}
|
||||
\setlength{\topmargin}{0pt}
|
||||
\setlength{\headheight}{0pt}
|
||||
\setlength{\headsep}{0pt}
|
||||
\setlength{\topskip}{0pt}
|
||||
\setlength{\textheight}{240mm}
|
||||
\setlength{\footskip}{5ex}
|
||||
\setlength{\oddsidemargin}{0pt}
|
||||
\setlength{\evensidemargin}{0pt}
|
||||
\setlength{\textwidth}{160mm}
|
||||
\usepackage[dvips]{graphics,color}
|
||||
\usepackage{helvet}
|
||||
\renewcommand{\familydefault}{\sfdefault}
|
||||
\begin{document}
|
||||
\begin{sffamily}
|
||||
\definecolor{rtb-black}{rgb} {0.0, 0.0, 0.0}
|
||||
\definecolor{rtb-navy}{rgb} {0.0, 0.0, 0.5}
|
||||
\definecolor{rtb-green}{rgb} {0.0, 0.5, 0.0}
|
||||
\definecolor{rtb-teal}{rgb} {0.0, 0.5, 0.5}
|
||||
\definecolor{rtb-maroon}{rgb} {0.5, 0.0, 0.0}
|
||||
\definecolor{rtb-purple}{rgb} {0.5, 0.0, 0.5}
|
||||
\definecolor{rtb-olive}{rgb} {0.5, 0.5, 0.0}
|
||||
\definecolor{rtb-silver}{rgb} {0.7, 0.7, 0.7}
|
||||
\definecolor{rtb-grey}{rgb} {0.5, 0.5, 0.5}
|
||||
\definecolor{rtb-blue}{rgb} {0.0, 0.0, 1.0}
|
||||
\definecolor{rtb-lime}{rgb} {0.0, 1.0, 0.0}
|
||||
\definecolor{rtb-aqua}{rgb} {0.0, 1.0, 1.0}
|
||||
\definecolor{rtb-red}{rgb} {1.0, 0.0, 0.0}
|
||||
\definecolor{rtb-fuchsia}{rgb}{1.0, 0.0, 1.0}
|
||||
\definecolor{rtb-yellow}{rgb} {1.0, 1.0, 0.0}
|
||||
\definecolor{rtb-white}{rgb} {1.0, 1.0, 1.0}
|
||||
|
||||
\begin{center}
|
||||
\bfseries{WiringPi: GPIO Pin Numbering Tables}\\
|
||||
\tt{https://wiki.odroid.com/odroid-c2/hardware/}
|
||||
\end{center}
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|}
|
||||
\hline
|
||||
\multicolumn{8}{|c|}{\bfseries{ODROID-C2: 40 Pin GPIO connector(J2)}}\\
|
||||
\hline
|
||||
\hline
|
||||
WiringPi Pin & Native GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & Native GPIO & WiringPi Pin\\
|
||||
\hline
|
||||
\hline
|
||||
& & \textcolor{rtb-red}{3.3v} & \raggedleft{1} & 2 & \textcolor{rtb-maroon}{5v} & & \\
|
||||
\hline
|
||||
8 & 205 (GPIODV.24) & \textcolor{rtb-aqua}{SDA1} & \raggedleft{3} & 4 & \textcolor{rtb-maroon}{5v} & & \\
|
||||
\hline
|
||||
9 & 206 (GPIODV.25) & \textcolor{rtb-aqua}{SCL1} & \raggedleft{5} & 6 & \textcolor{rtb-black}{0v} & & \\
|
||||
\hline
|
||||
7 & 249 (GPIOX.21) & \textcolor{rtb-green}{GPIO7} & \raggedleft{7} & 8 & \textcolor{rtb-yellow}{TxD} & 240 (GPIOX.12) & 15\\
|
||||
\hline
|
||||
& & \textcolor{rtb-black}{0v} & \raggedleft{9} & 10 & \textcolor{rtb-yellow}{RxD} & 241 (GPIOX.13) & 16\\
|
||||
\hline
|
||||
0 & 247 (GPIOX.19) & \textcolor{rtb-green}{GPIO0} & \raggedleft{11} & 12 & \textcolor{rtb-green}{GPIO1} & 238 (GPIOX.10) & 1\\
|
||||
\hline
|
||||
2 & 239 (GPIOX.11) & \textcolor{rtb-green}{GPIO2} & \raggedleft{13} & 14 & \textcolor{rtb-black}{0v} & & \\
|
||||
\hline
|
||||
3 & 237 (GPIOX.9) & \textcolor{rtb-green}{GPIO3} & \raggedleft{15} & 16 & \textcolor{rtb-green}{GPIO4} & 236 (GPIOX.8) & 4\\
|
||||
\hline
|
||||
& & \textcolor{rtb-red}{3.3v} & \raggedleft{17} & 18 & \textcolor{rtb-green}{GPIO5} & 233 (GPIOX.5) & 5\\
|
||||
\hline
|
||||
12 & 235 (GPIOX.7) & \textcolor{rtb-teal}{MOSI} & \raggedleft{19} & 20 & \textcolor{rtb-black}{0v} & & \\
|
||||
\hline
|
||||
13 & 232 (GPIOX.4) & \textcolor{rtb-teal}{MISO} & \raggedleft{21} & 22 & \textcolor{rtb-green}{GPIO6} & 231 (GPIOX.3) & 6\\
|
||||
\hline
|
||||
14 & 230 (GPIOX.2) & \textcolor{rtb-teal}{SCLK} & \raggedleft{23} & 24 & \textcolor{rtb-teal}{CE0} & 229 (GPIOX.1) & 10\\
|
||||
\hline
|
||||
& & \textcolor{rtb-black}{0v} & \raggedleft{25} & 26 & \textcolor{rtb-teal}{CE1} & 225 (GPIOY.14) & 11\\
|
||||
\hline
|
||||
30 & 207 (GPIODV.26) & \textcolor{rtb-aqua}{SDA2} & \raggedleft{27} & 28 & \textcolor{rtb-aqua}{SCL2} & 208 (GPIODV.27) & 31\\
|
||||
\hline
|
||||
21 & 228 (GPIOX.0) & \textcolor{rtb-green}{GPIO21} & \raggedleft{29} & 30 & \textcolor{rtb-black}{0v} & & \\
|
||||
\hline
|
||||
22 & 219 (GPIOY.8) & \textcolor{rtb-green}{GPIO22} & \raggedleft{31} & 32 & \textcolor{rtb-green}{GPIO26} & 224 (GPIOY.13) & 26\\
|
||||
\hline
|
||||
23 & 234 (GPIOX.6) & \textcolor{rtb-green}{GPIO23} & \raggedleft{33} & 34 & \textcolor{rtb-black}{0v} & & \\
|
||||
\hline
|
||||
24 & 214 (GPIOY.3) & \textcolor{rtb-green}{GPIO24} & \raggedleft{35} & 36 & \textcolor{rtb-green}{GPIO27} & 218 (GPIOY.7) & 27\\
|
||||
\hline
|
||||
25 & ADC.AIN1 & \textcolor{rtb-green}{GPIO25} & \raggedleft{37} & 38 & \textcolor{rtb-green}{GPIO28} & 1.8V Ref Out & 28\\
|
||||
\hline
|
||||
& & \textcolor{rtb-black}{0v} & \raggedleft{39} & 40 & \textcolor{rtb-green}{GPIO29} & ADC.AIN0 & 29\\
|
||||
\hline
|
||||
\hline
|
||||
WiringPi Pin & Native GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & Native GPIO & WiringPi Pin\\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\end{sffamily}
|
||||
\end{document}
|
||||
@@ -70,7 +70,8 @@ ifeq ($(BRAND_NAME), Odroid)
|
||||
SRC += odroidc1.c \
|
||||
odroidc2.c \
|
||||
odroidxu3.c \
|
||||
odroidn1.c
|
||||
odroidn1.c \
|
||||
odroidn2.c
|
||||
endif
|
||||
|
||||
HEADERS = $(shell ls *.h)
|
||||
@@ -157,6 +158,7 @@ ifeq ($(BRAND_NAME), Odroid)
|
||||
odroidc2.c : wiringPi.h wiringOdroid.h odroidc2.h
|
||||
odroidxu3.c : wiringPi.h wiringOdroid.h odroidxu3.h
|
||||
odroidn1.c : wiringPi.h wiringOdroid.h odroidn1.h
|
||||
odroidn2.c : wiringPi.h wiringOdroid.h odroidn2.h
|
||||
else
|
||||
wiringPi.o: softPwm.h softTone.h wiringPi.h ../version.h
|
||||
endif
|
||||
|
||||
514
wiringPi/odroidn2.c
Executable file
514
wiringPi/odroidn2.c
Executable file
@@ -0,0 +1,514 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
//
|
||||
// WiringPi ODROID-N2 Board Control file (AMLogic 64Bits Platform)
|
||||
//
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <asm/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#include "softPwm.h"
|
||||
#include "softTone.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#include "wiringOdroid.h"
|
||||
#include "odroidn2.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
// wiringPi gpio map define
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static const int pinToGpio_rev1[64] = {
|
||||
// wiringPi number to native gpio number
|
||||
479, 492, // 0 | 1 : GPIOX.3, GPIOX.16
|
||||
480, 483, // 2 | 3 : GPIOX.4, GPIOX.7
|
||||
476, 477, // 4 | 5 : GPIOX.0, GPIOX.1
|
||||
478, 473, // 6 | 7 : GPIOX.2, GPIOA.13
|
||||
493, 494, // 8 | 9 : GPIOX.17(I2C-2_SDA), GPIOX.18(I2C-2_SCL)
|
||||
486, 464, // 10 | 11 : GPIOX.10, GPIOA.4
|
||||
484, 485, // 12 | 13 : GPIOX.8, GPIOX.9
|
||||
487, 488, // 14 | 15 : GPIOX.11, GPIOX.12
|
||||
489, -1, // 16 | 17 : GPIOX.13,
|
||||
-1, -1, // 18 | 19 :
|
||||
-1, 490, // 20 | 21 : , GPIOX.14
|
||||
491, 481, // 22 | 23 : GPIOX.15, GPIOX.5
|
||||
482, -1, // 24 | 25 : GPIOX.6, ADC.AIN3
|
||||
472, 495, // 26 | 27 : GPIOA.12, GPIOX.19
|
||||
-1, -1, // 28 | 29 : REF1.8V OUT, ADC.AIN2
|
||||
474, 475, // 30 | 31 : GPIOA.14(I2C-3_SDA), GPIOA.15(I2C-3_SCL)
|
||||
// Padding:
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32...47
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 48...63
|
||||
};
|
||||
|
||||
static const int phyToGpio_rev1[64] = {
|
||||
// physical header pin number to native gpio number
|
||||
-1, // 0
|
||||
-1, -1, // 1 | 2 : 3.3V, 5.0V
|
||||
493, -1, // 3 | 4 : GPIOX.17(I2C-2_SDA), 5.0V
|
||||
494, -1, // 5 | 6 : GPIOX.18(I2C-2_SCL), GND
|
||||
473, 488, // 7 | 8 : GPIOA.13, GPIOX.12(UART_TX_B)
|
||||
-1, 489, // 9 | 10 : GND, GPIOX.13(UART_RX_B)
|
||||
479, 492, // 11 | 12 : GPIOX.3, GPIOX.16
|
||||
480, -1, // 13 | 14 : GPIOX.4, GND
|
||||
483, 476, // 15 | 16 : GPIOX.7, GPIOX.0
|
||||
-1, 477, // 17 | 18 : 3.3V, GPIOX.1
|
||||
484, -1, // 19 | 20 : GPIOX.8(SPI_MOSI), GND
|
||||
485, 478, // 21 | 22 : GPIOX.9(SPI_MISO), GPIOX.2
|
||||
487, 486, // 23 | 24 : GPIOX.11(SPI_SCLK), GPIOX.10(SPI_CE0)
|
||||
-1, 464, // 25 | 26 : GND, GPIOA.4(SPI_CE1)
|
||||
474, 475, // 27 | 28 : GPIOA.14(I2C-3_SDA), GPIOA.15(I2C-3_SCL)
|
||||
490, -1, // 29 | 30 : GPIOX.14, GND
|
||||
491, 472, // 31 | 32 : GPIOX.15, GPIOA.12
|
||||
481, -1, // 33 | 34 : GPIOX.5, GND
|
||||
482, 495, // 35 | 36 : GPIOX.6, GPIOX.19
|
||||
-1, -1, // 37 | 38 : ADC.AIN3, 1.8V REF OUT
|
||||
-1, -1, // 39 | 40 : GND, ADC.AIN2
|
||||
// Not used
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, // 41...48
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, // 49...56
|
||||
-1, -1, -1, -1, -1, -1, -1 // 57...63
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
// Global variable define
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
// wiringPi Pinmap control arrary
|
||||
/*----------------------------------------------------------------------------*/
|
||||
const int *pinToGpio, *phyToGpio;
|
||||
|
||||
/* ADC file descriptor */
|
||||
static char *adcFds[2];
|
||||
|
||||
/* GPIO mmap control */
|
||||
static volatile uint32_t *gpio, *gpio1;
|
||||
|
||||
/* wiringPi Global library */
|
||||
static struct libodroid *lib = NULL;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
// Function prototype define
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int gpioToGPSETReg (int pin);
|
||||
static int gpioToGPLEVReg (int pin);
|
||||
static int gpioToPUENReg (int pin);
|
||||
static int gpioToPUPDReg (int pin);
|
||||
static int gpioToShiftReg (int pin);
|
||||
static int gpioToGPFSELReg (int pin);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
// wiringPi core function
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int getModeToGpio (int mode, int pin);
|
||||
static void pinMode (int pin, int mode);
|
||||
static int getAlt (int pin);
|
||||
static void pullUpDnControl (int pin, int pud);
|
||||
static int digitalRead (int pin);
|
||||
static void digitalWrite (int pin, int value);
|
||||
static int analogRead (int pin);
|
||||
static void digitalWriteByte(const int value);
|
||||
static unsigned int digitalReadByte (void);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
// board init function
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void init_gpio_mmap (void);
|
||||
static void init_adc_fds (void);
|
||||
|
||||
void init_odroidn2 (struct libodroid *libwiring);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
// offset to the GPIO Set regsiter
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int gpioToGPSETReg (int pin)
|
||||
{
|
||||
if (pin >= N2_GPIOX_PIN_START && pin <= N2_GPIOX_PIN_END)
|
||||
return N2_GPIOX_OUTP_REG_OFFSET;
|
||||
if (pin >= N2_GPIOA_PIN_START && pin <= N2_GPIOA_PIN_END)
|
||||
return N2_GPIOA_OUTP_REG_OFFSET;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
// offset to the GPIO Input regsiter
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int gpioToGPLEVReg (int pin)
|
||||
{
|
||||
if (pin >= N2_GPIOX_PIN_START && pin <= N2_GPIOX_PIN_END)
|
||||
return N2_GPIOX_INP_REG_OFFSET;
|
||||
if (pin >= N2_GPIOA_PIN_START && pin <= N2_GPIOA_PIN_END)
|
||||
return N2_GPIOA_INP_REG_OFFSET;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
// offset to the GPIO Pull up/down enable regsiter
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int gpioToPUENReg (int pin)
|
||||
{
|
||||
if (pin >= N2_GPIOX_PIN_START && pin <= N2_GPIOX_PIN_END)
|
||||
return N2_GPIOX_PUEN_REG_OFFSET;
|
||||
if (pin >= N2_GPIOA_PIN_START && pin <= N2_GPIOA_PIN_END)
|
||||
return N2_GPIOA_PUEN_REG_OFFSET;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
// offset to the GPIO Pull up/down regsiter
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int gpioToPUPDReg (int pin)
|
||||
{
|
||||
if (pin >= N2_GPIOX_PIN_START && pin <= N2_GPIOX_PIN_END)
|
||||
return N2_GPIOX_PUPD_REG_OFFSET;
|
||||
if (pin >= N2_GPIOA_PIN_START && pin <= N2_GPIOA_PIN_END)
|
||||
return N2_GPIOA_PUPD_REG_OFFSET;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
// offset to the GPIO bit
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int gpioToShiftReg (int pin)
|
||||
{
|
||||
if (pin >= N2_GPIOX_PIN_START && pin <= N2_GPIOX_PIN_END)
|
||||
return pin - N2_GPIOX_PIN_START;
|
||||
if (pin >= N2_GPIOA_PIN_START && pin <= N2_GPIOA_PIN_END)
|
||||
return pin - N2_GPIOA_PIN_START;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
//
|
||||
// offset to the GPIO Function register
|
||||
//
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int gpioToGPFSELReg (int pin)
|
||||
{
|
||||
if(pin >= N2_GPIOX_PIN_START && pin <= N2_GPIOX_PIN_END)
|
||||
return N2_GPIOX_FSEL_REG_OFFSET;
|
||||
if(pin >= N2_GPIOA_PIN_START && pin <= N2_GPIOA_PIN_END)
|
||||
return N2_GPIOA_FSEL_REG_OFFSET;
|
||||
return -1;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int getModeToGpio (int mode, int pin)
|
||||
{
|
||||
int retPin = -1;
|
||||
|
||||
switch (mode) {
|
||||
/* Native gpio number */
|
||||
case MODE_GPIO:
|
||||
retPin = pin;
|
||||
break;
|
||||
/* Native gpio number for sysfs */
|
||||
case MODE_GPIO_SYS:
|
||||
retPin = lib->sysFds[pin] != -1 ? pin : -1;
|
||||
break;
|
||||
/* wiringPi number */
|
||||
case MODE_PINS:
|
||||
retPin = pin < 64 ? pinToGpio[pin] : -1;
|
||||
break;
|
||||
/* header pin number */
|
||||
case MODE_PHYS:
|
||||
retPin = pin < 64 ? phyToGpio[pin] : -1;
|
||||
break;
|
||||
default :
|
||||
msg(MSG_WARN, "%s : Unknown Mode %d\n", __func__, mode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* To check I2C module loaded */
|
||||
if (moduleLoaded(AML_MODULE_I2C) && (retPin == 205 || retPin == 206))
|
||||
return -1;
|
||||
else
|
||||
return retPin;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void pinMode (int pin, int mode)
|
||||
{
|
||||
int fsel, shift, origPin = pin;
|
||||
|
||||
if (lib->mode == MODE_GPIO_SYS)
|
||||
return;
|
||||
|
||||
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
||||
return;
|
||||
|
||||
softPwmStop (origPin);
|
||||
softToneStop (origPin);
|
||||
|
||||
fsel = gpioToGPFSELReg(pin);
|
||||
shift = gpioToShiftReg (pin);
|
||||
|
||||
switch (mode) {
|
||||
case INPUT:
|
||||
*(gpio + fsel) = (*(gpio + fsel) | (1 << shift));
|
||||
break;
|
||||
case OUTPUT:
|
||||
*(gpio + fsel) = (*(gpio + fsel) & ~(1 << shift));
|
||||
break;
|
||||
case SOFT_PWM_OUTPUT:
|
||||
softPwmCreate (pin, 0, 100);
|
||||
break;
|
||||
case SOFT_TONE_OUTPUT:
|
||||
softToneCreate (pin);
|
||||
break;
|
||||
default:
|
||||
msg(MSG_WARN, "%s : Unknown Mode %d\n", __func__, mode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int getAlt (int pin)
|
||||
{
|
||||
int fsel, shift;
|
||||
|
||||
if (lib->mode == MODE_GPIO_SYS)
|
||||
return 0;
|
||||
|
||||
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
||||
return 2;
|
||||
|
||||
fsel = gpioToGPFSELReg(pin);
|
||||
shift = gpioToShiftReg(pin);
|
||||
|
||||
return (*(gpio + fsel) & (1 << shift)) ? 0 : 1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void pullUpDnControl (int pin, int pud)
|
||||
{
|
||||
int shift = 0;
|
||||
|
||||
if (lib->mode == MODE_GPIO_SYS)
|
||||
return;
|
||||
|
||||
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
||||
return;
|
||||
|
||||
shift = gpioToShiftReg(pin);
|
||||
|
||||
if (pud) {
|
||||
// Enable Pull/Pull-down resister
|
||||
*(gpio + gpioToPUENReg(pin)) =
|
||||
(*(gpio + gpioToPUENReg(pin)) | (1 << shift));
|
||||
|
||||
if (pud == PUD_UP)
|
||||
*(gpio + gpioToPUPDReg(pin)) =
|
||||
(*(gpio + gpioToPUPDReg(pin)) | (1 << shift));
|
||||
else
|
||||
*(gpio + gpioToPUPDReg(pin)) =
|
||||
(*(gpio + gpioToPUPDReg(pin)) & ~(1 << shift));
|
||||
} else // Disable Pull/Pull-down resister
|
||||
*(gpio + gpioToPUENReg(pin)) =
|
||||
(*(gpio + gpioToPUENReg(pin)) & ~(1 << shift));
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int digitalRead (int pin)
|
||||
{
|
||||
char c ;
|
||||
|
||||
if (lib->mode == MODE_GPIO_SYS) {
|
||||
if (lib->sysFds[pin] == -1)
|
||||
return LOW ;
|
||||
|
||||
lseek (lib->sysFds[pin], 0L, SEEK_SET);
|
||||
read (lib->sysFds[pin], &c, 1);
|
||||
|
||||
return (c == '0') ? LOW : HIGH;
|
||||
}
|
||||
|
||||
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
||||
return 0;
|
||||
|
||||
if ((*(gpio + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin))) != 0)
|
||||
return HIGH ;
|
||||
else
|
||||
return LOW ;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void digitalWrite (int pin, int value)
|
||||
{
|
||||
if (lib->mode == MODE_GPIO_SYS) {
|
||||
if (lib->sysFds[pin] != -1) {
|
||||
if (value == LOW)
|
||||
write (lib->sysFds[pin], "0\n", 2);
|
||||
else
|
||||
write (lib->sysFds[pin], "1\n", 2);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if ((pin = getModeToGpio(lib->mode, pin)) < 0)
|
||||
return;
|
||||
|
||||
if (value == LOW)
|
||||
*(gpio + gpioToGPSETReg(pin)) &= ~(1 << gpioToShiftReg(pin));
|
||||
else
|
||||
*(gpio + gpioToGPSETReg(pin)) |= (1 << gpioToShiftReg(pin));
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int analogRead (int pin)
|
||||
{
|
||||
unsigned char value[5] = {0,};
|
||||
|
||||
if (lib->mode == MODE_GPIO_SYS)
|
||||
return 0;
|
||||
|
||||
/* wiringPi ADC number = pin 25, pin 29 */
|
||||
switch (pin) {
|
||||
case 0: case 25:
|
||||
pin = 0;
|
||||
break;
|
||||
case 1: case 29:
|
||||
pin = 1;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
if (adcFds [pin] == -1)
|
||||
return 0;
|
||||
|
||||
lseek (adcFds [pin], 0L, SEEK_SET);
|
||||
read (adcFds [pin], &value[0], 4);
|
||||
|
||||
return atoi(value);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void digitalWriteByte (const int value)
|
||||
{
|
||||
union reg_bitfield gpiox;
|
||||
union reg_bitfield gpioa;
|
||||
|
||||
gpiox.wvalue = *(gpio + N2_GPIOX_INP_REG_OFFSET);
|
||||
gpioa.wvalue = *(gpio + N2_GPIOA_INP_REG_OFFSET);
|
||||
|
||||
/* Wiring PI GPIO0 = N2 GPIOX.3 */
|
||||
gpiox.bits.bit3 = (value & 0x01);
|
||||
/* Wiring PI GPIO1 = N2 GPIOX.16 */
|
||||
gpiox.bits.bit16 = (value & 0x02);
|
||||
/* Wiring PI GPIO2 = N2 GPIOX.4 */
|
||||
gpiox.bits.bit4 = (value & 0x04);
|
||||
/* Wiring PI GPIO3 = N2 GPIOX.7 */
|
||||
gpiox.bits.bit7 = (value & 0x08);
|
||||
/* Wiring PI GPIO4 = N2 GPIOX.0 */
|
||||
gpiox.bits.bit0 = (value & 0x10);
|
||||
/* Wiring PI GPIO5 = N2 GPIOX.1 */
|
||||
gpiox.bits.bit1 = (value & 0x20);
|
||||
/* Wiring PI GPIO6 = N2 GPIOX.2 */
|
||||
gpiox.bits.bit2 = (value & 0x40);
|
||||
/* Wiring PI GPIO7 = N2 GPIOA.13 */
|
||||
gpioa.bits.bit13 = (value & 0x80);
|
||||
|
||||
*(gpio + N2_GPIOX_OUTP_REG_OFFSET) = gpiox.wvalue;
|
||||
*(gpio + N2_GPIOA_OUTP_REG_OFFSET) = gpioa.wvalue;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static unsigned int digitalReadByte (void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void init_gpio_mmap (void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
/* GPIO mmap setup */
|
||||
if (access("/dev/gpiomem",0) == 0) {
|
||||
if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
|
||||
return msg (MSG_ERR,
|
||||
"wiringPiSetup: Unable to open /dev/gpiomem: %s\n",
|
||||
strerror (errno)) ;
|
||||
} else {
|
||||
if (geteuid () != 0)
|
||||
return msg (MSG_ERR,
|
||||
"wiringPiSetup: Must be root. (Did you forget sudo?)\n");
|
||||
|
||||
if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
|
||||
return msg (MSG_ERR,
|
||||
"wiringPiSetup: Unable to open /dev/mem: %s\n",
|
||||
strerror (errno)) ;
|
||||
}
|
||||
//#define ODROIDN2_GPIO_BASE 0xff634000
|
||||
gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED, fd, ODROIDN2_GPIO_BASE) ;
|
||||
|
||||
if ((int32_t)gpio == -1)
|
||||
return msg (MSG_ERR,
|
||||
"wiringPiSetup: mmap (GPIO) failed: %s\n",
|
||||
strerror (errno));
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void init_adc_fds (void)
|
||||
{
|
||||
const char *AIN0_NODE, *AIN1_NODE;
|
||||
|
||||
/* ADC node setup */
|
||||
AIN0_NODE = "/sys/class/saradc/ch0";
|
||||
AIN1_NODE = "/sys/class/saradc/ch1";
|
||||
|
||||
adcFds[0] = open(AIN0_NODE, O_RDONLY);
|
||||
adcFds[1] = open(AIN1_NODE, O_RDONLY);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void init_odroidn2 (struct libodroid *libwiring)
|
||||
{
|
||||
init_gpio_mmap();
|
||||
|
||||
init_adc_fds();
|
||||
|
||||
pinToGpio = pinToGpio_rev1;
|
||||
phyToGpio = phyToGpio_rev1;
|
||||
|
||||
/* wiringPi Core function initialize */
|
||||
libwiring->getModeToGpio = getModeToGpio;
|
||||
libwiring->pinMode = pinMode;
|
||||
libwiring->getAlt = getAlt;
|
||||
libwiring->pullUpDnControl = pullUpDnControl;
|
||||
libwiring->digitalRead = digitalRead;
|
||||
libwiring->digitalWrite = digitalWrite;
|
||||
libwiring->analogRead = analogRead;
|
||||
libwiring->digitalWriteByte = digitalWriteByte;
|
||||
libwiring->digitalReadByte = digitalReadByte;
|
||||
|
||||
/* specify pin base number */
|
||||
libwiring->pinBase = GPIO_PIN_BASE;
|
||||
|
||||
/* global variable setup */
|
||||
lib = libwiring;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
47
wiringPi/odroidn2.h
Executable file
47
wiringPi/odroidn2.h
Executable file
@@ -0,0 +1,47 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/*
|
||||
|
||||
WiringPi ODROID-N2 Board Header file
|
||||
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef __ODROID_N2_H__
|
||||
#define __ODROID_N2_H__
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define ODROIDN2_GPIO_MASK (0xFFFFFF00)
|
||||
#define ODROIDN2_GPIO_BASE 0xff634000
|
||||
|
||||
#define GPIO_PIN_BASE 410
|
||||
|
||||
#define N2_GPIOA_PIN_START (GPIO_PIN_BASE + 50)
|
||||
#define N2_GPIOA_PIN_END (GPIO_PIN_BASE + 65)
|
||||
#define N2_GPIOX_PIN_START (GPIO_PIN_BASE + 66)
|
||||
#define N2_GPIOX_PIN_END (GPIO_PIN_BASE + 85)
|
||||
|
||||
#define N2_GPIOX_FSEL_REG_OFFSET 0x116
|
||||
#define N2_GPIOX_OUTP_REG_OFFSET 0x117
|
||||
#define N2_GPIOX_INP_REG_OFFSET 0x118
|
||||
#define N2_GPIOX_PUPD_REG_OFFSET 0x13C
|
||||
#define N2_GPIOX_PUEN_REG_OFFSET 0x14A
|
||||
|
||||
#define N2_GPIOA_FSEL_REG_OFFSET 0x120
|
||||
#define N2_GPIOA_OUTP_REG_OFFSET 0x121
|
||||
#define N2_GPIOA_INP_REG_OFFSET 0x122
|
||||
#define N2_GPIOA_PUPD_REG_OFFSET 0x13F
|
||||
#define N2_GPIOA_PUEN_REG_OFFSET 0x14D
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void init_odroidn2 (struct libodroid *libwiring);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#endif /* __ODROID_N2_H__ */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "odroidc2.h"
|
||||
#include "odroidxu3.h"
|
||||
#include "odroidn1.h"
|
||||
#include "odroidn2.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
// Const string define
|
||||
@@ -47,6 +48,7 @@ const char *piModelNames [16] =
|
||||
"ODROID-C2",
|
||||
"ODROID-XU3/4",
|
||||
"ODROID-N1",
|
||||
"ODROID-N2",
|
||||
};
|
||||
|
||||
const char *piRevisionNames [16] =
|
||||
@@ -337,7 +339,8 @@ int piGpioLayout (void)
|
||||
printf ("piGpioLayout: last4Chars are: \"%s\"\n", c) ;
|
||||
|
||||
if ((strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0) ||
|
||||
(strcmp (c, "000a") == 0) || (strcmp (c, "0100") == 0) )
|
||||
(strcmp (c, "000a") == 0) || (strcmp (c, "0100") == 0) ||
|
||||
(strcmp (c, "0400") == 0) )
|
||||
gpioLayout = 1;
|
||||
else
|
||||
gpioLayout = 2;
|
||||
@@ -374,6 +377,11 @@ int piGpioLayout (void)
|
||||
libwiring.maker = MAKER_ROCKCHIP;
|
||||
libwiring.mem = 4;
|
||||
libwiring.rev = 1;
|
||||
} else if (strncmp (c, "04", 2) == 0) {
|
||||
libwiring.model = MODEL_ODROID_N2;
|
||||
libwiring.maker = MAKER_AMLOGIC;
|
||||
libwiring.mem = 4;
|
||||
libwiring.rev = 1;
|
||||
} else {
|
||||
libwiring.model = MODEL_UNKNOWN;
|
||||
libwiring.maker = MAKER_UNKNOWN;
|
||||
@@ -406,6 +414,7 @@ int piBoardRev (void)
|
||||
* Rev 1.0 : /sys/class/odroid/boardrev value is 0 (Dev board)
|
||||
* Rev 1.1 : /sys/class/odroid/boardrev value is 1 (Mass board)
|
||||
* 03xx - Model ODROID N1, 4096M, Hardkernel
|
||||
* 04xx - Model ODROID N2, 4096M, Hardkernel
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty)
|
||||
@@ -830,6 +839,9 @@ int wiringPiSetup (void)
|
||||
case MODEL_ODROID_N1:
|
||||
init_odroidn1(&libwiring);
|
||||
break;
|
||||
case MODEL_ODROID_N2:
|
||||
init_odroidn2(&libwiring);
|
||||
break;
|
||||
default:
|
||||
return wiringPiFailure (WPI_ALMOST,
|
||||
"wiringPiSetup: Unknown model\n");
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#define MODEL_ODROID_C2 2
|
||||
#define MODEL_ODROID_XU3 3
|
||||
#define MODEL_ODROID_N1 4
|
||||
#define MODEL_ODROID_N2 5
|
||||
|
||||
#define MAKER_UNKNOWN 0
|
||||
#define MAKER_AMLOGIC 1
|
||||
|
||||
@@ -232,6 +232,9 @@ int wiringPiI2CSetup (const int devId)
|
||||
case MODEL_ODROID_N1:
|
||||
device = "/dev/i2c-4";
|
||||
break;
|
||||
case MODEL_ODROID_N2:
|
||||
device = "/dev/i2c-3";
|
||||
break;
|
||||
}
|
||||
|
||||
return wiringPiI2CSetupInterface (device, devId) ;
|
||||
|
||||
@@ -120,6 +120,9 @@ int wiringPiSPISetupMode (int channel, int speed, int mode)
|
||||
case MODEL_ODROID_N1:
|
||||
device = spiDevType1;
|
||||
break;
|
||||
case MODEL_ODROID_N2:
|
||||
device = "/dev/spidev0.0";
|
||||
break;
|
||||
}
|
||||
|
||||
if ((fd = open (device, O_RDWR)) < 0)
|
||||
|
||||
Reference in New Issue
Block a user