📄 devices.c
字号:
/* devices.c: * This code provides the monitor with the ability to treat the peripherals * as an entry in a device table so that each device can be accessed through * read, write, ioctl, init, open and close. * The device table header file is defined as part of the target-specific * code and contains all of the target-specific device entries. */#include "devtbl.h"#include "devices.h"#include "genlib.h"#include "stddefs.h"/* devtbldump(): * Dump the contents of the device table. */voiddevtbldump(){ int i; /* Dump the device table and add an asterisk next to the console device. */ for(i=0;i<DEVTOT;i++) { printf("Dev %d: %s%s\n",i,devtbl[i].name, ConsoleDevice == i ? " (console)" : ""); }}/* isbaddev(): * Return the result of a basic range check of the device number. */intisbaddev(int dev){ if ((dev < 0) || (dev >= DEVTOT)) { printf("Invalid device: %d\n",dev); return(1); } return(0);}/* Upper half device driver interfaces: */intinit(int dev,ulong arg){ if (isbaddev(dev) || !devtbl[dev].init) return(-1); return (devtbl[dev].init(arg));}intopen(int dev,ulong arg1,ulong arg2){ if (isbaddev(dev) || !devtbl[dev].open) return(-1); return (devtbl[dev].open(arg1,arg2));}intclose(int dev){ if (isbaddev(dev) || !devtbl[dev].close) return(-1); return (devtbl[dev].close());}intioctl(int dev,int func,ulong data1,ulong data2){ if (isbaddev(dev) || !devtbl[dev].ctrl) return(-1); return (devtbl[dev].ctrl(func,data1,data2));}intread(int dev,char *buf,int cnt){ if (isbaddev(dev) || !devtbl[dev].read) return(-1); return (devtbl[dev].read(buf,cnt));}intwrite(int dev,char *buf,int cnt){ if (isbaddev(dev) || !devtbl[dev].read) return(-1); return (devtbl[dev].write(buf,cnt));}/* devInit(): * Step through the device table and execute each devices' initialization * function (if any). If any device initialization fails, print out an * error message and immediately branch to the montor's command loop. * Since it is through this point that the monitor's UARTs are first * initialized, we pass in a baudrate that is then handed to each of the * device initialization routines (although it is only used by serial * devices). */intdevInit(int baud){ int fd; if (baud == 0) baud = ConsoleBaudRate; /* Keep track of the last baud rate, so that it can be used if the * incoming baudrate is NULL. */ ConsoleBaudRate = baud; fd = 0; for(fd=0;fd<DEVTOT;fd++) { /* If device table does not have an init function, skip over it. */ if (!devtbl[fd].init) continue; if (devtbl[fd].init((ulong)baud) != 0) { printf("devInit() <%s> FAILED\n",devtbl[fd].name); CommandLoop(); } } return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -