version 1.1, 2007/11/15 20:48:27 |
version 1.2, 2007/11/24 19:07:07 |
|
|
#include <sys/bus.h> |
#include <sys/bus.h> |
#include <sys/gpio.h> |
#include <sys/gpio.h> |
|
|
#include <arch/sam7s64/dev/sapioreg.h> |
#include <arch/sam7s64/dev/at91sam7.h> |
#include <arch/sam7s64/dev/sapiovar.h> |
#include <arch/sam7s64/dev/sapiovar.h> |
|
|
/* |
/* |
|
|
/* acquire bus_handle from parent */ |
/* acquire bus_handle from parent */ |
ddp->pio_bhp = self->dv_parent->dv_aux; |
ddp->pio_bhp = self->dv_parent->dv_aux; |
|
|
/* save our location on parent (or use default if loc == 0) */ |
|
ddp->pio_ioaddr = (loc != 0) ? loc : SAPIO_BASE; |
|
|
|
gcp->gc_pinread = sapio_pinread; |
gcp->gc_pinread = sapio_pinread; |
gcp->gc_pinwrite = sapio_pinwrite; |
gcp->gc_pinwrite = sapio_pinwrite; |
gcp->gc_pinset = sapio_pinset; |
gcp->gc_pinset = sapio_pinset; |
|
|
|
|
/* PIO or Periph. ? */ |
/* PIO or Periph. ? */ |
if (pin.gp_pio == 0) |
if (pin.gp_pio == 0) |
bus_write_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_PDR, 1 << pin.gp_pinno); |
bus_write_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_PDR, 1 << pin.gp_pinno); |
else |
else |
bus_write_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_PER, 1 << pin.gp_pinno); |
bus_write_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_PER, 1 << pin.gp_pinno); |
|
|
/* flags */ |
/* flags */ |
if (pin.gp_flags & GPIO_PIN_OUTPUT) |
if (pin.gp_flags & GPIO_PIN_OUTPUT) |
/* enable output */ |
/* enable output */ |
bus_write_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_OER, 1 << pin.gp_pinno); |
bus_write_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_OER, 1 << pin.gp_pinno); |
else |
else |
/* disable output */ |
/* disable output */ |
bus_write_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_ODR, 1 << pin.gp_pinno); |
bus_write_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_ODR, 1 << pin.gp_pinno); |
|
|
/* data */ |
/* data */ |
if (pin.gp_value == 1) |
if (pin.gp_value == 1) |
bus_write_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_SODR, 1 << pin.gp_pinno); |
bus_write_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_SODR, 1 << pin.gp_pinno); |
else |
else |
bus_write_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_CODR, 1 << pin.gp_pinno); |
bus_write_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_CODR, 1 << pin.gp_pinno); |
} |
} |
|
|
|
|
|
|
gp.gp_pinno = pin; |
gp.gp_pinno = pin; |
|
|
/* see if this pin belongs to Peripherals (0) or to PIO (1) */ |
/* see if this pin belongs to Peripherals (0) or to PIO (1) */ |
gp.gp_pio = bus_read_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_PSR) & (1 << pin); |
gp.gp_pio = bus_read_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_PSR) & (1 << pin); |
|
|
/* get state through Output Status Register */ |
/* get state through Output Status Register */ |
gp.gp_flags = (bus_read_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_OSR) & (1 << pin)) ? |
gp.gp_flags = (bus_read_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_OSR) & (1 << pin)) ? |
GPIO_PIN_INPUT | GPIO_PIN_OUTPUT : GPIO_PIN_INPUT; /* XXX how to determine input flag? */ |
GPIO_PIN_INPUT | GPIO_PIN_OUTPUT : GPIO_PIN_INPUT; /* XXX how to determine input flag? */ |
|
|
/* read value in Pin Data Status Register */ |
/* read value in Pin Data Status Register */ |
gp.gp_value = bus_read_4(sdd->pio_bhp, sdd->pio_ioaddr + SAPIO_PIO_PDSR) & (1 << pin); |
gp.gp_value = bus_read_4(sdd->pio_bhp, (uint32_t)AT91C_PIOA_PDSR) & (1 << pin); |
|
|
return(gp); |
return(gp); |
} |
} |