/* handler for UIC interrupt */ void uic_interrupt(rt_uint32_t uic_base, int vec_base) { int vec; rt_uint32_t uic_msr; rt_uint32_t msr_shift; /* * Read masked interrupt status register to determine interrupt source */ uic_msr = get_dcr(uic_base + UIC_MSR); msr_shift = uic_msr; vec = vec_base; while (msr_shift != 0) { if (msr_shift & 0x80000000) uic_int_handler(vec); /* * Shift msr to next position and increment vector */ msr_shift <<= 1; vec++; } }
/* ======================================================================= * Interpreter command to retrieve an register value through AMCC PPC 4xx * Device Control Register inderect addressing. * ======================================================================= */ int do_getidcr (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { unsigned short adr_dcrn; /* Device Control Register Num for Address */ unsigned short dat_dcrn; /* Device Control Register Num for Data */ unsigned short offset; /* Register's offset */ unsigned long value; /* Register's value */ char *ptr = NULL; char buf[80]; /* Validate arguments */ if (argc < 3) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } /* Find out whether ther is '.' (dot) symbol in the first parameter. */ strncpy (buf, argv[1], sizeof(buf)-1); buf[sizeof(buf)-1] = 0; /* will guarantee zero-end string */ ptr = strchr (buf, '.'); if (ptr != NULL) { /* First parameter has format adr_dcrn.dat_dcrn */ *ptr++ = 0; /* erase '.', create zero-end string */ adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); dat_dcrn = (unsigned short) simple_strtoul (ptr, NULL, 16); } else { /* * First parameter has format adr_dcrn; dat_dcrn will be * calculated as adr_dcrn+1. */ adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); dat_dcrn = adr_dcrn+1; } /* Register's offset */ offset = (unsigned short) simple_strtoul (argv[2], NULL, 16); /* Disable interrupts */ disable_interrupts (); /* Set offset */ set_dcr (adr_dcrn, offset); /* get data */ value = get_dcr (dat_dcrn); /* Enable interrupts */ enable_interrupts (); printf ("%04x.%04x-%04x Read %08lx\n", adr_dcrn, dat_dcrn, offset, value); return 0; }
int do_dumpdcr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { int i; printf("\nDevice Configuration Registers (DCR's) for PPC405GP:"); for (i=0; i<=0x1e0; i++) { if (!(i % 0x8)) { printf("\n%04x ", i); } printf("%08lx ", get_dcr(i)); } printf("\n"); return 0; }
/* ====================================================================== * Interpreter command to set an AMCC PPC 4xx Device Control Register * ====================================================================== */ int do_setdcr (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { unsigned long get_dcr (unsigned short); unsigned long set_dcr (unsigned short, unsigned long); unsigned short dcrn; /* Device Control Register Num */ unsigned long value; /* DCR's value */ int nbytes; extern char console_buffer[]; /* Validate arguments */ if (argc < 2) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } /* Set a DCR */ dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16); do { value = get_dcr (dcrn); printf ("%04x: %08lx", dcrn, value); nbytes = readline (" ? "); if (nbytes == 0) { /* * <CR> pressed as only input, don't modify current * location and exit command. */ nbytes = 1; return 0; } else { unsigned long i; char *endp; i = simple_strtoul (console_buffer, &endp, 16); nbytes = endp - console_buffer; if (nbytes) set_dcr (dcrn, i); } } while (nbytes); return 0; }
/* ======================================================================= * Interpreter command to retrieve an AMCC PPC 4xx Device Control Register * ======================================================================= */ int do_getdcr ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] ) { unsigned short dcrn; /* Device Control Register Num */ unsigned long value; /* DCR's value */ unsigned long get_dcr (unsigned short); /* Validate arguments */ if (argc < 2) return cmd_usage(cmdtp); /* Get a DCR */ dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16); value = get_dcr (dcrn); printf ("%04x: %08lx\n", dcrn, value); return 0; }