📄 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.
*/
void
devtbldump()
{
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.
*/
int
isbaddev(int dev)
{
if ((dev < 0) || (dev >= DEVTOT)) {
printf("Invalid device: %d\n",dev);
return(1);
}
return(0);
}
/* Upper half device driver interfaces: */
int
init(int dev,ulong arg)
{
if (isbaddev(dev) || !devtbl[dev].init)
return(-1);
return (devtbl[dev].init(arg));
}
int
open(int dev,ulong arg1,ulong arg2)
{
if (isbaddev(dev) || !devtbl[dev].open)
return(-1);
return (devtbl[dev].open(arg1,arg2));
}
int
close(int dev)
{
if (isbaddev(dev) || !devtbl[dev].close)
return(-1);
return (devtbl[dev].close(dev));
}
int
ioctl(int dev,int func,ulong data1,ulong data2)
{
if (isbaddev(dev) || !devtbl[dev].ctrl)
return(-1);
return (devtbl[dev].ctrl(func,data1,data2));
}
int
read(int dev,char *buf,int cnt)
{
if (isbaddev(dev) || !devtbl[dev].read)
return(-1);
return (devtbl[dev].read(buf,cnt));
}
int
write(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).
*/
int
devInit(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 + -