hal_unistd_inf.c
来自「基于ARM和uC/OS-II实现的串口控制台」· C语言 代码 · 共 195 行
C
195 行
#include "../../inc/pub/hal_types.h"
#include "../../inc/pub/hal_errno.h"
#include <stdio.h>
#include "../../inc/dev/hal_fcntl.h"
#include "../../inc/dev/hal_file.h"
#include "../../inc/inf/hal_unistd_inf.h"
extern hal_llist hal_dev_list;
/*
* open() 用于获得一个名字为参数name的设备的文件描述符,利用read(),write()等函数
* 对设备进行操作,需要使用该设备对应的文件描述符。
*/
int HAL_OPEN (const char* file, int flags, int mode)
{
hal_dev* dev;
hal_fd* fd;
int index = -1;
int status = -ENODEV;
/*
* 检查已经注册的设备链表
*/
dev = hal_find_dev (file, &hal_dev_list);
if (dev) /*如果匹配到合适的设备,则分配一个文件描述符 */
{
if ((index = hal_get_fd (dev)) < 0)
{
status = index;
}
else
{
fd = &hal_fd_list[index];
fd->fd_flags = flags; //(flags & ~HAL_FD_FLAGS_MASK);
status = (dev->open) ? dev->open(fd, file, flags, mode): 0;
}
}
else
{
status = -ENODEV;
}
/* 如果分配失败,则清除并返回错误 */
if (status < 0)
{
hal_release_fd (index);
return status;
}
return index;
}
/*
* close() 由应用程序调用,用于释放一个文件描述符,如果,驱动本身提供了
* 相应的close()回掉函数,则同时会调用该函数,然后,本文件描述符被标记
* 为空。
* HAL_CLOSE 在hal_syscall.h中被映射到close()函数。
*/
int HAL_CLOSE (int fildes)
{
hal_fd* fd;
int rval;
fd = (fildes < 0) ? NULL : &hal_fd_list[fildes];
if (fd)
{
/*
* 如果器件驱动本身的close()回调函数存在,则首先调用该函数
*/
rval = (fd->dev->close) ? fd->dev->close(fd) : 0;
/* 释放文件描述符 */
hal_release_fd (fildes);
if (rval < 0)
{
return -1;
}
return 0;
}
else
{
return -1;
}
}
/*
* read() 函数被影射到HAL_READ()函数
*/
int HAL_READ (int file, void *ptr, int len)
{
hal_fd* fd;
/*
* 检查输入是否为有效
*/
fd = (file < 0) ? NULL : &hal_fd_list[file];
if (fd)
{
/*
* 如果该设备没有以合适的方式打开或,设备驱动程序没有实现read()函数
* 则返回错误。
*/
if (((fd->fd_flags & O_ACCMODE) != O_WRONLY) &&
(fd->dev->read))
{
return fd->dev->read(fd, ptr, len);
}
else
{
return -EACCES;
}
}
else
{
return -EBADFD;
}
}
/*
* HAL_WRITE()函数映射到write()函数,这个函数仅仅简单地调用对应设备驱动程序的write()函数
*/
int HAL_WRITE (int file, const void *ptr, int len)
{
hal_fd* fd;
fd = (file < 0) ? NULL : &hal_fd_list[file];
if (fd)
{
/*
* 如果文件没有以写允许的模式打开或设备驱动没实现write()函数,则返回错误
* 否则调用设备驱动提供的write函数。
*/
if (((fd->fd_flags & O_ACCMODE) != O_RDONLY) && fd->dev->write)
{
return fd->dev->write(fd, ptr, len) ;
}
else
{
return -EACCES;
}
}
else
{
return -EBADFD;
}
}
int HAL_LSEEK (int file, int ptr, int whence)
{
hal_fd* fd;
int rc = 0;
fd = (file < 0) ? NULL : &hal_fd_list[file];
if (fd)
{
if (fd->dev->lseek)
{
rc = fd->dev->lseek(fd, ptr, whence);
}
else
{
rc = -ENOTSUP;
}
}
else
{
rc = -EBADFD;
}
return rc;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?