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 + -
显示快捷键?