⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adb.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
字号:
/* * Copyright (C) 1996 Paul Mackerras. */#include "nonstdio.h"#include "privinst.h"#define scanhex	xmon_scanhex#define skipbl	xmon_skipbl#define ADB_B		(*(volatile unsigned char *)0xf3016000)#define ADB_SR		(*(volatile unsigned char *)0xf3017400)#define ADB_ACR		(*(volatile unsigned char *)0xf3017600)#define ADB_IFR		(*(volatile unsigned char *)0xf3017a00)static inline void eieio(void) { asm volatile ("eieio" : :); }#define N_ADB_LOG	1000struct adb_log {    unsigned char b;    unsigned char ifr;    unsigned char acr;    unsigned int time;} adb_log[N_ADB_LOG];int n_adb_log;voidinit_adb_log(void){    adb_log[0].b = ADB_B;    adb_log[0].ifr = ADB_IFR;    adb_log[0].acr = ADB_ACR;    adb_log[0].time = get_dec();    n_adb_log = 0;}voiddump_adb_log(void){    unsigned t, t0;    struct adb_log *ap;    int i;    ap = adb_log;    t0 = ap->time;    for (i = 0; i <= n_adb_log; ++i, ++ap) {	t = t0 - ap->time;	printf("b=%x ifr=%x acr=%x at %d.%.7d\n", ap->b, ap->ifr, ap->acr,	       t / 1000000000, (t % 1000000000) / 100);    }}voidadb_chklog(void){    struct adb_log *ap = &adb_log[n_adb_log + 1];    ap->b = ADB_B;    ap->ifr = ADB_IFR;    ap->acr = ADB_ACR;    if (ap->b != ap[-1].b || (ap->ifr & 4) != (ap[-1].ifr & 4)	|| ap->acr != ap[-1].acr) {	ap->time = get_dec();	++n_adb_log;    }}intadb_bitwait(int bmask, int bval, int fmask, int fval){    int i;    struct adb_log *ap;    for (i = 10000; i > 0; --i) {	adb_chklog();	ap = &adb_log[n_adb_log];	if ((ap->b & bmask) == bval && (ap->ifr & fmask) == fval)	    return 0;    }    return -1;}intadb_wait(void){    if (adb_bitwait(0, 0, 4, 4) < 0) {	printf("adb: ready wait timeout\n");	return -1;    }    return 0;}voidadb_readin(void){    int i, j;    unsigned char d[64];    if (ADB_B & 8) {	printf("ADB_B: %x\n", ADB_B);	return;    }    i = 0;    adb_wait();    j = ADB_SR;    eieio();    ADB_B &= ~0x20;    eieio();    for (;;) {	if (adb_wait() < 0)	    break;	d[i++] = ADB_SR;	eieio();	if (ADB_B & 8)	    break;	ADB_B ^= 0x10;	eieio();    }    ADB_B |= 0x30;    if (adb_wait() == 0)	j = ADB_SR;    for (j = 0; j < i; ++j)	printf("%.2x ", d[j]);    printf("\n");}intadb_write(unsigned char *d, int i){    int j;    unsigned x;    if ((ADB_B & 8) == 0) {	printf("r: ");	adb_readin();    }    for (;;) {	ADB_ACR = 0x1c;	eieio();	ADB_SR = d[0];	eieio();	ADB_B &= ~0x20;	eieio();	if (ADB_B & 8)	    break;	ADB_ACR = 0xc;	eieio();	ADB_B |= 0x20;	eieio();	adb_readin();    }    adb_wait();    for (j = 1; j < i; ++j) {	ADB_SR = d[j];	eieio();	ADB_B ^= 0x10;	eieio();	if (adb_wait() < 0)	    break;    }    ADB_ACR = 0xc;    eieio();    x = ADB_SR;    eieio();    ADB_B |= 0x30;    return j;}voidadbcmds(void){    char cmd;    unsigned rtcu, rtcl, dec, pdec, x;    int i, j;    unsigned char d[64];    cmd = skipbl();    switch (cmd) {    case 't':	for (;;) {	    rtcl = get_rtcl();	    rtcu = get_rtcu();	    dec = get_dec();	    printf("rtc u=%u l=%u dec=%x (%d = %d.%.7d)\n",		   rtcu, rtcl, dec, pdec - dec, (pdec - dec) / 1000000000,		   ((pdec - dec) % 1000000000) / 100);	    pdec = dec;	    if (cmd == 'x')		break;	    while (xmon_read(stdin, &cmd, 1) != 1)		;	}	break;    case 'r':	init_adb_log();	while (adb_bitwait(8, 0, 0, 0) == 0)	    adb_readin();	break;    case 'w':	i = 0;	while (scanhex(&x))	    d[i++] = x;	init_adb_log();	j = adb_write(d, i);	printf("sent %d bytes\n", j);	while (adb_bitwait(8, 0, 0, 0) == 0)	    adb_readin();	break;    case 'l':	dump_adb_log();	break;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -