int gpio_setdir(int port, int pin, int direction) { if (check_params(port, pin)) { return -1; } const unsigned int *bitmask = get_bitmask(port); register volatile unsigned int *r, *c; volatile int position; position = get_index(port, pin); if ((position < 0) || (position >= GPIO_ADDRESS_MAX)) { fprintf(stderr,"error: invalid position: %d\n", position); return -1; } /** set GPIO on the pad control */ c = (void *)gpio.control + get_control(port, pin); *c |= 0x07; /** set register address */ r = (void*)gpio.address[position] + GPIO_OE; switch(direction) { case GPIO_DIR_OUTPUT: *r &= ~(bitmask[pin]); break; case GPIO_DIR_INPUT: *r |= (bitmask[pin]); break; default: fprintf(stderr,"error: invalid direction %d\n", direction); return -1; } return 0; }
static void test_behavior () { rw_info (0, 0, 0, "behavior of <cctype> functions in the \"C\" locale"); char extra_str [80]; char missing_str [80]; for (int i = 0; i != 256; ++i) { typedef unsigned char UChar; const int c = UChar (i); int mask = 0; mask |= std::isalnum (c) ? bit_alnum : 0; mask |= std::isalpha (c) ? bit_alpha : 0; mask |= std::iscntrl (c) ? bit_cntrl : 0; mask |= std::isdigit (c) ? bit_digit : 0; mask |= std::isgraph (c) ? bit_graph : 0; mask |= std::islower (c) ? bit_lower : 0; mask |= std::isprint (c) ? bit_print : 0; mask |= std::ispunct (c) ? bit_punct : 0; mask |= std::isspace (c) ? bit_space : 0; mask |= std::isupper (c) ? bit_upper : 0; mask |= std::isxdigit (c) ? bit_xdigit : 0; const int extra_bits = mask & ~char_mask [i]; const int missing_bits = ~mask & char_mask [i]; rw_assert (mask == char_mask [i], 0, 0, "%#c mask%{?} missing bits %s (%#x)%{;}" "%{?} extra bits %s (%#x)%{;}", c, missing_bits, get_bitmask (missing_bits, missing_str), missing_bits, extra_bits, get_bitmask (extra_bits, extra_str), extra_bits); } }
int gpio_write(int port, int pin, int status) { if (check_params(port, pin)) { return -1; } const unsigned int *bitmask = get_bitmask(port); volatile int position; position = get_index(port, pin); if ((position < 0) || (position >= GPIO_ADDRESS_MAX)) { fprintf(stderr,"error: invalid position: %d\n", position); return -1; } status = ((status == GPIO_ON) ? GPIO_SETDATAOUT : GPIO_CLEARDATAOUT); *((unsigned int *)((void *)gpio.address[position] + status)) = bitmask[pin]; return 0; }
int gpio_read(int port, int pin) { if (check_params(port, pin)) { return -1; } const unsigned int *bitmask = get_bitmask(port); volatile int position; int ret; position = get_index(port, pin); if ((position < 0) || (position >= GPIO_ADDRESS_MAX)) { fprintf(stderr,"error: invalid position: %d\n", position); return -1; } ret = (*((unsigned int *)((void *)gpio.address[position] + GPIO_DATAIN)) & bitmask[pin]); return (ret == 0 ? GPIO_OFF : GPIO_ON); }