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

📄 devices.c

📁 umon bootloader source code, support mips cpu.
💻 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 + -