You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.6 KiB
117 lines
2.6 KiB
#include "kernel.h"
|
|
|
|
#undef __FILENAME__
|
|
#define __FILENAME__ "kernel.c"
|
|
|
|
// 设备内核
|
|
extern const unsigned char Image$$KERNEL_ROM$$Base;
|
|
extern char Image$$KERNEL_ROM$$Length[];
|
|
|
|
#define KERNEL_DEVICE_COUNT (((int)Image$$KERNEL_ROM$$Length) >> 2)
|
|
|
|
static int *kernel_map = (int *)(&Image$$KERNEL_ROM$$Base);
|
|
|
|
#define kernel_list(x) ((KENERAL_NODE *)(kernel_map[x]))
|
|
|
|
int open(char *filename, int flags)
|
|
{
|
|
int i = 0;
|
|
int status = K_FAIL;
|
|
|
|
for (i = 0; i < KERNEL_DEVICE_COUNT; i++)
|
|
{
|
|
if (strcmp(filename, kernel_list(i)->filename) == 0)
|
|
{
|
|
if (kernel_list(i)->ops->f_open == NULL)
|
|
{
|
|
return K_OPS_NULL;
|
|
}
|
|
status = kernel_list(i)->ops->f_open(flags);
|
|
if (status == K_SUCCESS)
|
|
{
|
|
return i;
|
|
}
|
|
else
|
|
{
|
|
return k_OPEN_FAIL;
|
|
}
|
|
}
|
|
}
|
|
return K_NOFOUND;
|
|
}
|
|
|
|
int write(int handle, unsigned char *buff, unsigned int len, void *param)
|
|
{
|
|
int status = K_FAIL;
|
|
if ((handle < KERNEL_DEVICE_COUNT) && (handle >= 0))
|
|
{
|
|
if (kernel_list(handle)->ops->f_write == NULL)
|
|
{
|
|
return K_OPS_NULL;
|
|
}
|
|
status = kernel_list(handle)->ops->f_write(buff, len, param);
|
|
return status;
|
|
}
|
|
return K_FAIL;
|
|
}
|
|
|
|
int read(int handle, unsigned char *buff, unsigned int len, void *param)
|
|
{
|
|
int status = K_FAIL;
|
|
if ((handle < KERNEL_DEVICE_COUNT) && (handle >= 0))
|
|
{
|
|
if (kernel_list(handle)->ops->f_read == NULL)
|
|
{
|
|
return K_OPS_NULL;
|
|
}
|
|
status = kernel_list(handle)->ops->f_read(buff, len, param);
|
|
return status;
|
|
}
|
|
return K_FAIL;
|
|
}
|
|
|
|
int ioctl(int handle, unsigned int cmd, unsigned long arg)
|
|
{
|
|
int status = K_FAIL;
|
|
if ((handle < KERNEL_DEVICE_COUNT) && (handle >= 0))
|
|
{
|
|
if (kernel_list(handle)->ops->f_ioctl == NULL)
|
|
{
|
|
return K_OPS_NULL;
|
|
}
|
|
status = kernel_list(handle)->ops->f_ioctl(cmd, arg);
|
|
return status;
|
|
}
|
|
return K_FAIL;
|
|
}
|
|
|
|
int close(int handle)
|
|
{
|
|
int status = K_FAIL;
|
|
if ((handle < KERNEL_DEVICE_COUNT) && (handle >= 0))
|
|
{
|
|
if (kernel_list(handle)->ops->f_close == NULL)
|
|
{
|
|
return K_OPS_NULL;
|
|
}
|
|
status = kernel_list(handle)->ops->f_close();
|
|
return status;
|
|
}
|
|
return K_FAIL;
|
|
}
|
|
|
|
int isopen(int handle)
|
|
{
|
|
int status = K_FAIL;
|
|
if ((handle < KERNEL_DEVICE_COUNT) && (handle >= 0))
|
|
{
|
|
if (kernel_list(handle)->ops->f_isopen == NULL)
|
|
{
|
|
return K_OPS_NULL;
|
|
}
|
|
status = kernel_list(handle)->ops->f_isopen();
|
|
return status;
|
|
}
|
|
return K_FAIL;
|
|
}
|
|
|
|
|