hal_dev.c

来自「基于ARM和uC/OS-II实现的串口控制台」· C语言 代码 · 共 121 行

C
121
字号
#include "../../inc/dev/hal_unistd_dev.h"
#include "../../inc/dev/hal_file.h"
#include "../../inc/dev/hal_dev_llist.h"
#include "../../inc/pub/hal_types.h"
#include "../../inc/pub/hal_errno.h"
#include <stdio.h>



/*
 * "hal_dev_list" 是注册的设备链表的头. 它被配置为启动时包含一个设备
 * 即 "hal_dev_null"。
 */
extern hal_dev  hal_dev_null; 

hal_llist  hal_dev_list = {&hal_dev_null.llist, &hal_dev_null.llist};

/*
 * hal_dev_null_write() 是hal_dev_null设备的写函数,该函数被调用时
 * 什么都不作,仅仅丢弃数据,然后返回写入成功。
 */
static int hal_dev_null_write (hal_fd* fd, const char* ptr, int len)
{
    return len;
}

/*
 * "hal_dev_null"主要用于输出重定向,这个设备是hal_sys_init()被调用前系统
 * 唯一的器件,stdin, stdout stderr在系统启动时到被定向到这个设备,以使得 
 * 一些系统调用是安全的,比如如果移植了C运行时库,那么在设备被注册前,调用 
 * printf()函数也做到是安全的
 */
hal_dev hal_dev_null = 
{
    {
        &hal_dev_list,
        &hal_dev_list
    },
    "/dev/null",  /*器件名字*/
    NULL,               /* open */
    NULL,               /* close */
    NULL,               /* write */
    hal_dev_null_write, /* write */
    NULL,               /* lseek */   
    NULL,               /* fstat */ 
    NULL                /* ioctl */
 };

/*
 * "hal_fd_list_lock" 为控制文件描述符链表访问的信号量,用于保证对它的
 * 访问是线程安全的。
 */
//HAL_SEM(hal_fd_list_lock)

/*
 * "hal_max_fd" 用于指出已经分配的文件描述符的最大值,使得对文件描述符
 * 的访问变得高效,不用每次搜索完整个文件描述符表(未分配的不搜索)
 */
hal_32 hal_max_fd = -1;

/*
 * "hal_fd_list" 是文件描述符表,在这个数据中,最先的三个元素被配置为
 * standard in, standard out, 和 standard error。剩余的则为未分配。
 *
 * HAL_MAX_FD为一个宏,指出最多可以支持的文件描述符个数。
 */
hal_fd hal_fd_list[HAL_MAX_FD] = 
{
    {
        &hal_dev_null, /* standard in */
        0,
        0
    },
    {
        &hal_dev_null, /* standard out */
        0,
        0
    },
    {
        &hal_dev_null, /* standard error */
        0,
        0
    }
};



int hal_dev_llist_insert (hal_dev_llist* dev, hal_llist* list)
{
    
    if (!dev || !dev->name)
    {
        return -EINVAL;
    }
    
    hal_llist_insert(list, &dev->llist);  /* 注册设备 */
    
    return 0;  
}


/*
 * The hal_dev_reg() 用于在系统中注册一个设备,一旦注册成功就可以利用标准
 * 的posix调用来操作该器件,如open(), read(), write()等
 *
 * 注意,如果要注册的设备名字与系统中已注册的设备的名字相同,则操作的结果
 * 会带来问题。
 */
int hal_dev_reg (hal_dev* dev)
{
    
    if (!dev->name)  /* 检查器件的名字是否有效 */
    {
        return -EINVAL;
    }
    
    hal_llist_insert(&hal_dev_list, &dev->llist);  /* 注册设备 */

    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?