=================================================================== RCS file: /cvs/funnyos/arch/testarm/dev/tartc.c,v retrieving revision 1.1 retrieving revision 1.4 diff -u -r1.1 -r1.4 --- funnyos/arch/testarm/dev/tartc.c 2007/10/16 09:41:04 1.1 +++ funnyos/arch/testarm/dev/tartc.c 2007/11/04 22:55:58 1.4 @@ -1,23 +1,76 @@ /* - * $Id: tartc.c,v 1.1 2007/10/16 08:41:04 init Exp $ + * $Id: tartc.c,v 1.4 2007/11/04 22:55:58 init Exp $ */ #include #include +#include + +#include +#include #include /* * testarm Real Time Clock driver. */ +int tartc_attach(struct device *, uint32_t loc, uint8_t flags); +void tartc_interrupt(struct device *); -/* TODO */ +struct driver tartc_dr = { + sizeof(struct tartc_dd), + tartc_attach, + NULL, + tartc_interrupt +}; + + int -tartc_attach(struct device *self) +tartc_attach(struct device *self, uint32_t loc, uint8_t flags) { + struct tartc_dd *ddp = self->dv_devdata; + uint32_t seconds; - printf("testarm Real Time Clock\n"); + /* acquire bus_handle from parent */ + ddp->td_bushandlep = self->dv_parent->dv_aux; + /* save our location on parent (or use default if loc == 0) */ + ddp->td_ioaddr = (loc != 0) ? loc : TARTC_REG_BASE; + + /* + * Read seconds past Epoch. + */ + /* trigger clock update on host */ + bus_write_1(ddp->td_bushandlep, ddp->td_ioaddr + TARTC_OFF_CLOCKUPDATE, 1); + + /* get seconds past Epoch */ + seconds = bus_read_4(ddp->td_bushandlep, ddp->td_ioaddr + TARTC_OFF_READSECONDS); + + printf("testarm Real Time Clock (%d seconds past Epoch)\n", seconds); + + /* XXX set timer */ + bus_write_1(ddp->td_bushandlep, ddp->td_ioaddr + TARTC_OFF_TMRINTRFREQ, 1); + return(0); +} + + +void +tartc_interrupt(struct device *self) +{ + /* TODO */ + struct tartc_dd *ddp = self->dv_devdata; + + /* acknowledge one timer intr */ + bus_write_1(ddp->td_bushandlep, ddp->td_ioaddr + TARTC_OFF_TMRINTRACK, 0xff); + + /* + * Update seconds and print it. + */ + bus_write_1(ddp->td_bushandlep, ddp->td_ioaddr + TARTC_OFF_CLOCKUPDATE, 0xff); + printf("tartc intr: %d seconds past Epoch\n", + bus_read_4(ddp->td_bushandlep, ddp->td_ioaddr + TARTC_OFF_READSECONDS)); + + printf("tartc intr\n"); }