📄 dump_exca.c
字号:
}static void dump_timing(proc_exca *ex, int i){ printf(" Timing set %d: ", i); print_time("setup", ex->reg.b[PD67_TIME_SETUP(i)]); print_time(", command", ex->reg.b[PD67_TIME_CMD(i)]); print_time(", recovery", ex->reg.b[PD67_TIME_RECOV(i)]); printf("\n");}void dump_ext(proc_exca *ex){ u_char v; printf(" Extension registers:"); printf(" "); v = ex->ext[PD67_DATA_MASK0]; printf("mask 0 = 0x%02x", v); v = ex->reg.b[PD67_DATA_MASK1]; printf(", mask 1 = 0x%02x", v); v = ex->reg.b[PD67_DMA_CTL]; printf(", DMA ctl = 0x%02x", v); switch (v & PD67_DMA_MODE) { case PD67_DMA_OFF: printf(" [off]"); break; case PD67_DMA_DREQ_INPACK: printf(" [dreq is inpack]"); break; case PD67_DMA_DREQ_WP: printf(" [dreq is wp]"); break; case PD67_DMA_DREQ_BVD2: printf(" [dreq is bvd2]"); break; } if (v & PD67_DMA_PULLUP) printf(" [pullup]"); printf("\n");}/*====================================================================*//* Vadem-specific registers */static void dump_vsense(proc_exca *ex){ int v = ex->reg.b[VG469_VSENSE]; printf(" Card voltage sense = 0x%02x\n ", v); if (v & VG469_VSENSE_A_VS1) printf(" [a_vs1]"); if (v & VG469_VSENSE_A_VS2) printf(" [a_vs2]"); if (v & VG469_VSENSE_B_VS1) printf(" [b_vs1]"); if (v & VG469_VSENSE_B_VS2) printf(" [b_vs2]"); printf("\n");}static void dump_vselect(proc_exca *ex){ int v = ex->reg.b[VG469_VSELECT]; printf(" Card voltage select = 0x%02x\n ", v); switch (v & VG469_VSEL_VCC) { case 0: printf(" [Vcc=5v]"); break; case 1: printf(" [Vcc=3.3v]"); break; case 2: printf(" [Vcc=X.Xv]"); break; case 3: printf(" [Vcc=3.3v]"); break; } switch (v & VG469_VSEL_MAX) { case 0: printf(" [Vmax=5v]"); break; case 1: printf(" [Vmax=3.3v]"); break; case 2: printf(" [Vmax=X.Xv]"); break; case 3: printf(" [Vcc=3.3v]"); break; } if (v & VG469_VSEL_EXT_STAT) printf(" [extended]"); if (v & VG469_VSEL_EXT_BUS) printf(" [buffer]"); if (v & VG469_VSEL_MIXED) printf(" [mixed]"); else printf(" [5v only]"); if (v & VG469_VSEL_ISA) printf(" [3v bus]"); else printf(" [5v bus]"); printf("\n");}static void dump_control(proc_exca *ex){ int v = ex->reg.b[VG468_CTL]; printf(" Control register = 0x%02x\n ", v); if (v & VG468_CTL_SLOW) printf(" [slow]"); if (v & VG468_CTL_ASYNC) printf(" [async]"); if (v & VG468_CTL_TSSI) printf(" [tri-state]"); if (v & VG468_CTL_DELAY) printf(" [debounce]"); if (v & VG469_CTL_STRETCH) printf(" [stretch]"); if (v & VG468_CTL_INPACK) printf(" [inpack]"); if (v & VG468_CTL_POLARITY) printf(" [active high]"); else printf(" [active low]"); if (v & VG468_CTL_COMPAT) printf(" [compat]"); printf("\n");}static void dump_misc(proc_exca *ex){ int v = ex->reg.b[VG468_MISC]; printf(" Misc register = 0x%02x\n ", v); if (v & VG468_MISC_GPIO) printf(" [gpio]"); if (v & VG468_MISC_DMAWSB) printf(" [DMA ws]"); if (v & VG469_MISC_LEDENA) printf(" [LED ena]"); if (v & VG468_MISC_VADEMREV) printf(" [Vadem rev]"); if (v & VG468_MISC_UNLOCK) printf(" [unlock]"); printf("\n");}static void dump_ext_mode(proc_exca *ex, proc_info *in){ int v = ex->reg.b[VG469_EXT_MODE]; printf(" Extended mode %c = 0x%02x\n ", (in->psock ? 'B' : 'A'), v); if (in->psock) { if (v & VG469_MODE_B_3V) printf(" [3.3v sock B]"); } else { if (v & VG469_MODE_INT_SENSE) printf(" [int sense]"); if (v & VG469_MODE_CABLE) printf(" [cable mode]"); if (v & VG469_MODE_COMPAT) printf(" [DF compat]"); if (v & VG469_MODE_TEST) printf(" [test]"); if (v & VG469_MODE_RIO) printf(" [RIO to INTR]"); } printf("\n");}/*====================================================================*/static void dump_memwin(proc_exca *ex, proc_info *in, int w){ u_int start, stop, off; char flags[50]; start = ex->reg.w[(I365_MEM(w)+I365_W_START)>>1]; stop = ex->reg.w[(I365_MEM(w)+I365_W_STOP)>>1]; off = ex->reg.w[(I365_MEM(w)+I365_W_OFF)>>1]; if (ex->reg.b[I365_ADDRWIN] & I365_ENA_MEM(w)) strcpy(flags, " [on]"); else strcpy(flags, " [off]"); if (start & I365_MEM_16BIT) strcat(flags, " [16bit]"); else strcat(flags, " [8bit]"); if (in->flags & IS_CIRRUS) { if (stop & I365_MEM_WS1) strcat(flags, " [time1]"); else strcat(flags, " [time0]"); } else { if (start & I365_MEM_0WS) strcat(flags, " [0ws]"); if (stop & I365_MEM_WS1) strcat(flags, " [ws1]"); if (stop & I365_MEM_WS0) strcat(flags, " [ws0]"); } if (off & I365_MEM_WRPROT) strcat(flags, " [wrprot]"); if (off & I365_MEM_REG) strcat(flags, " [reg]"); start = (start & 0x0fff) << 12; stop = ((stop & 0x0fff) << 12) + 0x0fff; off = (off & 0x3fff) << 12; start += ex->reg.b[CB_MEM_PAGE(w)]<<24; stop += ex->reg.b[CB_MEM_PAGE(w)]<<24; off = (off+start) & 0x3ffffff; printf(" memory %d: 0x%04x-0x%04x @ 0x%08x%s\n", w, off, off+stop-start, start, flags);}static void dump_iowin(proc_exca *ex, proc_info *in, int w){ u_short ctl, off = 0; if (in->flags & IS_CIRRUS) off = ex->reg.w[PD67_IO_OFF(w)>>1]; printf(" io %d: 0x%04x-0x%04x", w, off + ex->reg.w[(I365_IO(w)+I365_W_START)>>1], off + ex->reg.w[(I365_IO(w)+I365_W_STOP)>>1]); if (off) printf(" @ 0x%04x", ex->reg.w[(I365_IO(w)+I365_W_START)>>1]); if (ex->reg.b[I365_ADDRWIN] & I365_ENA_IO(w)) printf(" [on]"); else printf(" [off]"); ctl = ex->reg.b[I365_IOCTL]; if (in->flags & IS_CIRRUS) { if (ctl & I365_IOCTL_WAIT(w)) printf(" [time1]"); else printf(" [time0]"); } else { if (ctl & I365_IOCTL_WAIT(w)) printf(" [wait]"); if (ctl & I365_IOCTL_0WS(w)) printf(" [0ws]"); } if (ctl & I365_IOCTL_IOCS16(w)) printf(" [iocs16]"); if (ctl & I365_IOCTL_16BIT(w)) printf(" [16bit]\n"); else printf(" [8bit]\n");}/*====================================================================*/void dump_sock(proc_exca *ex, proc_info *in){ int i; printf(" Identification and revision = 0x%02x\n", ex->reg.b[I365_IDENT]); if (in->flags & IS_CIRRUS) printf(" Chip information = 0x%02x\n", ex->reg.b[PD67_CHIP_INFO]); dump_status(ex); dump_power(ex); if (in->flags & IS_VG469) dump_vselect(ex); dump_intctl(ex); dump_csc(ex); dump_cscint(ex); if (in->flags & IS_CIRRUS) { dump_misc1(ex); dump_misc2(ex); } else { dump_genctl(ex); dump_gblctl(ex); } if (in->flags & IS_VG469) { dump_vsense(ex); dump_ext_mode(ex, in); } if ((in->flags & IS_VG468) || (in->flags & IS_VG469)) { dump_control(ex); dump_misc(ex); } for (i = 0; i < 5; i++) dump_memwin(ex, in, i); for (i = 0; i < 2; i++) dump_iowin(ex, in, i); if (in->flags & IS_CIRRUS) { for (i = 0; i < 2; i++) dump_timing(ex, i); dump_ext(ex); } printf("\n");} /* dump_sock *//*====================================================================*/int main(int argc, char *argv[]){ char fn[100]; int i; proc_exca *ex; proc_info *in; if (access("/proc/bus/pccard", R_OK) != 0) fprintf(stderr, "/proc/bus/pccard does not exist!\n"); for (i = 0; ; i++) { sprintf(fn, "/proc/bus/pccard/%02d/exca", i); if (access(fn, R_OK) != 0) break; ex = load_exca(fn); sprintf(fn, "/proc/bus/pccard/%02d/info", i); in = load_info(fn); printf("Socket %d:\n", i); dump_sock(ex, in); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -