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

📄 devices.c

📁 完整的Bell实验室的嵌入式文件系统TFS
💻 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 + -