#17 PinDrive
This commit is contained in:
30
gpio/gpio.c
30
gpio/gpio.c
@@ -794,6 +794,31 @@ void doMode (int argc, char *argv [])
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void doPadDrivePin (int argc, char *argv [])
|
||||
{
|
||||
|
||||
if (argc != 4) {
|
||||
fprintf (stderr, "Usage: %s drivepin pin value\n", argv [0]) ;
|
||||
exit (1) ;
|
||||
}
|
||||
|
||||
int pin = atoi (argv [2]) ;
|
||||
int val = atoi (argv [3]) ;
|
||||
|
||||
if ((pin < 0) || (pin > 27)) {
|
||||
fprintf (stderr, "%s: drive pin not 0-27: %d\n", argv [0], pin) ;
|
||||
exit (1) ;
|
||||
}
|
||||
|
||||
if ((val < 0) || (val > 3)) {
|
||||
fprintf (stderr, "%s: drive value not 0-3: %d\n", argv [0], val) ;
|
||||
exit (1) ;
|
||||
}
|
||||
|
||||
setPadDrivePin (pin, val) ;
|
||||
}
|
||||
|
||||
|
||||
static void doPadDrive (int argc, char *argv [])
|
||||
{
|
||||
int group, val ;
|
||||
@@ -807,13 +832,13 @@ static void doPadDrive (int argc, char *argv [])
|
||||
group = atoi (argv [2]) ;
|
||||
val = atoi (argv [3]) ;
|
||||
|
||||
if ((group < -1) || (group > 2)) //-1 hidden feature for read value of all
|
||||
if ((group < -1) || (group > 2)) //-1 hidden feature for read and print values
|
||||
{
|
||||
fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ;
|
||||
exit (1) ;
|
||||
}
|
||||
|
||||
if ((val < -1) || (val > 7))
|
||||
if ((val < 0) || (val > 7))
|
||||
{
|
||||
fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ;
|
||||
exit (1) ;
|
||||
@@ -1536,6 +1561,7 @@ int main (int argc, char *argv [])
|
||||
else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ;
|
||||
else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ;
|
||||
else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
|
||||
else if (strcasecmp (argv [1], "drivepin" ) == 0) doPadDrivePin(argc, argv) ;
|
||||
else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ;
|
||||
else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ;
|
||||
else if (strcasecmp (argv [1], "pins" ) == 0) doReadall () ;
|
||||
|
||||
@@ -151,7 +151,10 @@ const unsigned int RP1_STATUS_LEVEL_MASK = 0x00C00000;
|
||||
const unsigned int RP1_DEBOUNCE_DEFAULT_VALUE = 4;
|
||||
const unsigned int RP1_DEBOUNCE_MASK = 0x7f;
|
||||
const unsigned int RP1_DEBOUNCE_DEFAULT = (RP1_DEBOUNCE_DEFAULT_VALUE << 5);
|
||||
const unsigned int RP1_PAD_DEFAULT = 0x5a;
|
||||
|
||||
const unsigned int RP1_PAD_DEFAULT_0TO8 = (0x0B | 0x70); //Slewfast, Schmitt, PullUp, | 12mA, Input enable
|
||||
const unsigned int RP1_PAD_DEFAULT_FROM9 = (0x07 | 0x70); //Slewfast, Schmitt, PullDown, | 12mA, Input enable
|
||||
|
||||
const unsigned int RP1_PAD_DRIVE_MASK = 0x00000030;
|
||||
const unsigned int RP1_INV_PAD_DRIVE_MASK = ~(RP1_PAD_DRIVE_MASK);
|
||||
|
||||
@@ -1248,6 +1251,19 @@ int physPinToGpio (int physPin)
|
||||
* Set the PAD driver value
|
||||
*********************************************************************************
|
||||
*/
|
||||
void setPadDrivePin (int pin, int value) {
|
||||
if (PI_MODEL_5 != RaspberryPiModel) return;
|
||||
if (pin < 0 || pin > GetMaxPin()) return ;
|
||||
|
||||
uint32_t wrVal;
|
||||
value = value & 3; // 0-3 supported
|
||||
wrVal = (value << 4); //Drive strength 0-3
|
||||
pads[1+pin] = (pads[1+pin] & RP1_INV_PAD_DRIVE_MASK) | wrVal;
|
||||
if (wiringPiDebug) {
|
||||
printf ("setPadDrivePin: pin: %d, value: %d (%08X)\n", pin, value, pads[1+pin]) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void setPadDrive (int group, int value)
|
||||
{
|
||||
@@ -1682,8 +1698,8 @@ void pinMode (int pin, int mode)
|
||||
shift = gpioToShift [pin] ;
|
||||
|
||||
if (mode == INPUT) {
|
||||
if (PI_MODEL_5 == RaspberryPiModel) {
|
||||
pads[1+pin] = RP1_PAD_DEFAULT;
|
||||
if (PI_MODEL_5 == RaspberryPiModel) {
|
||||
pads[1+pin] = (pin<=8) ? RP1_PAD_DEFAULT_0TO8 : RP1_PAD_DEFAULT_FROM9;
|
||||
gpio[2*pin+1] = RP1_FSEL_GPIO | RP1_DEBOUNCE_DEFAULT; // GPIO
|
||||
rio[RP1_RIO_OE + RP1_CLR_OFFSET] = 1<<pin; // Input
|
||||
} else {
|
||||
@@ -1691,7 +1707,7 @@ void pinMode (int pin, int mode)
|
||||
}
|
||||
} else if (mode == OUTPUT) {
|
||||
if (PI_MODEL_5 == RaspberryPiModel) {
|
||||
pads[1+pin] = RP1_PAD_DEFAULT;
|
||||
pads[1+pin] = (pin<=8) ? RP1_PAD_DEFAULT_0TO8 : RP1_PAD_DEFAULT_FROM9;
|
||||
gpio[2*pin+1] = RP1_FSEL_GPIO | RP1_DEBOUNCE_DEFAULT; // GPIO
|
||||
rio[RP1_RIO_OE + RP1_SET_OFFSET] = 1<<pin; // Output
|
||||
} else {
|
||||
|
||||
@@ -236,6 +236,7 @@ extern void piBoardId (int *model, int *rev, int *mem, int *m
|
||||
extern int wpiPinToGpio (int wpiPin) ;
|
||||
extern int physPinToGpio (int physPin) ;
|
||||
extern void setPadDrive (int group, int value) ;
|
||||
extern void setPadDrivePin (int pin, int value); // Interface V2
|
||||
extern int getAlt (int pin) ;
|
||||
extern void pwmToneWrite (int pin, int freq) ;
|
||||
extern void pwmSetMode (int mode) ;
|
||||
|
||||
Reference in New Issue
Block a user