White Papers

10
if (gc->pins[pin].mode != GPIO_MODE_OUTPUT) {
fprintf(stderr, "%s: pin %d is not an output pin\n", __FUNCTION__, pin);
return -EINVAL;
}
int index = pin / 8;
int dev_num = sio_devices[index].device_num;
int base_port = sio_devices[index].base_port;
enter_extended_function_mode();
lpc_reg_write(0x07, dev_num);
bmp = lpc_reg_read(base_port+1);
bit = (1 << (pin % 8));
if ( level )
bmp |= bit;
else
bmp &= ~bit;
lpc_reg_write(base_port+1, bmp);
leave_extended_function_mode();
return 0;
}
int gpio_pin_get_level(gpio_controller *gc, int pin, int *level)
{
int index, dev_num, base_port, bmp;
VERIFY_PARAMETERS(gc, pin);
index = pin / 8;
dev_num = sio_devices[index].device_num;
base_port = sio_devices[index].base_port;
enter_extended_function_mode();
lpc_reg_write(0x07, dev_num);
bmp = lpc_reg_read(base_port+1);
leave_extended_function_mode();
*level = !!(bmp & (1 << (pin % 8)));
return 0;
}
int gpio_pin_set_direction(gpio_controller *gc, int pin, int dir)
{
int index, dev_num, base_port, bmp;
VERIFY_PARAMETERS(gc, pin);
// On Embedded Box PC 5000 system, change the directions of GPIO pins is not allowed
if ( dir == GPIO_MODE_OUTPUT ) {
if ( !(gc->pins[pin].capability & GPIO_CAP_OUTPUT) ) {
fprintf(stderr, "%s: pin number %d could not be output\n",
__FUNCTION__, pin);
return -EINVAL;
}
}
else if ( dir == GPIO_MODE_INPUT ) {
if ( !(gc->pins[pin].capability & GPIO_CAP_INPUT) ) {
fprintf(stderr, "%s: pin number %d could not be input\n",