/****************************************************************************** 版权所有: 珠海欧力配网自动化股份有限公司 文件名称: file_led.c 文件版本: 01.00 创建作者: 赵海洋 创建日期: 2020-03-13 功能说明: 故障指示灯记忆文件 其它说明: 修改记录: */ /*------------------------------- 头文件 -------------------------------------- */ #include "head.h" /*------------------------------- 宏定义 -------------------------------------- */ /*------------------------------ 类型结构 ------------------------------------- */ /*------------------------------ 全局变量 ------------------------------------- */ u32 g_file_led_sign; struct file_led_res *g_file_led_read; struct file_led_res g_file_led_write[SWITCH_NUM_MAX]; struct file *file_led_handle; // 故障LED状态bin文件句柄 /*------------------------------ 局部变量 ------------------------------------- */ // 文件CRC校验 u16 g_crc_file_led_res; /*------------------------------ 函数声明 ------------------------------------- */ static int _file_led_init(void); static int _file_led_creat(void); static int _file_led_write(void); /*------------------------------ 外部函数 ------------------------------------- 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性. */ /****************************************************************************** 函数名称: file_led_init 函数版本: 01.00 创建作者: 赵海洋 创建日期: 2020年3月20日 函数说明: 故障LED状态系统初始化 参数说明: 返回值: 0: 成功 其它: 失败 修改记录: */ int file_led_init(void) { int i; unsigned long us,us0; i = _file_led_init(); if (i != 0) { rt_printf("iret = %d\r\n", i); rt_file_del("/app/data/file_led.bin"); us0 = ustimer_get_origin(); i = _file_led_creat(); us = ustimer_get_duration(us0); rt_printf("初始化故障LED记录文件, ret=%d, 耗时 t=%dus\r\n", i, us); } return i; } /****************************************************************************** 函数名称: _file_led_init 函数版本: 01.00 创建作者: 赵海洋 创建日期: 2020年3月20日 函数说明: 故障LED状态初始化调用 参数说明: 返回值: 0: 成功 其它: 失败 修改记录: */ int _file_led_init(void) { int j; u32 len; u8 *buf; u8 *tmp; struct file_led_res_head *brh; loff_t pos; // 打开文件 file_led_handle = rt_file_open("/app/data/file_led.bin",O_RDWR ,0655); if(IS_ERR(file_led_handle)) { return -1; } // 得到文件长度 // 得到文件长度 len = rt_file_getfile_size(file_led_handle); if(len <= 0) { rt_file_close(file_led_handle,0); return -1; } // 分配内存 buf = rt_malloc(len); if((buf) == NULL) { rt_file_close(file_led_handle,0); return -2; } //保存原指针,便于以后释放内存 tmp = buf; // 读出内容 pos = 0; if(rt_file_read(file_led_handle,buf,len,&pos) != len) { rt_file_close(file_led_handle,0); rt_free(buf); return -3; } // 检查CRC g_crc_file_led_res = CrcStr(buf,len-2); if(g_crc_file_led_res != *(u16*)(buf+len-2)) { rt_free(buf); return -4; } // 检查文件签名 brh = (struct file_led_res_head*)buf; if(brh->cfh.signature != SIG_FILE_LED_RES_FILE) { rt_free(buf); return -5; } // rt_printf("运行到这里....file_led_addr=%d,file_led_num=%d\r\n",brh->file_led_addr,brh->file_led_num); // 检查文件长度 if(len < sizeof(*brh) + brh->file_led_num*sizeof(struct file_led_res)+ 2) { rt_free(buf); return -6; } // 文件头的长度写入了file_led_addr g_file_led_read = (struct file_led_res *)(buf + brh->file_led_addr); // 初始化故障LED状态结构体 memset(g_file_led_write,0,sizeof(g_file_led_write)); for(j=0;jfile_led_num;j++) { g_file_led_write[j].led_hw=g_file_led_read[j].led_hw; g_file_led_write[j].led_tw=g_file_led_read[j].led_tw; g_file_led_write[j].led_gl=g_file_led_read[j].led_gl; g_file_led_write[j].led_jd=g_file_led_read[j].led_jd; } buf = tmp; //释放内存 rt_free(buf); return 0; } /****************************************************************************** 函数名称: file_led_exit 函数版本: 01.00 创建作者: 赵海洋 创建日期: 2020年3月20日 函数说明: 故障LED状态文件句柄退出 参数说明: 返回值: 0: 成功 其它: 失败 修改记录: */ int file_led_exit(void) { // 清除文件指针 if(file_led_handle != 0) { rt_file_close(file_led_handle,0); file_led_handle = 0; } return 0; } /****************************************************************************** 函数名称: _file_led_creat 函数版本: 01.00 创建作者: 赵海洋 创建日期: 2020年3月20日 函数说明: 创建LED显示灯状态文件 参数说明: 返回值: 0: 成功 其它: 失败 修改记录: */ int _file_led_creat(void) { unsigned int i,file_length; u16 crc16; char *p; loff_t pos; int ret; struct file_led_res_head fh; struct file_led_res desc; // 配置文件头 memset(&fh,0,sizeof(fh)); fh.cfh.signature = SIG_FILE_LED_RES_FILE; fh.cfh.version = 0X01010101; fh.file_led_addr = FILE_ADDR_ALGIN(sizeof(fh)); // 故障LED状态数据容量 fh.file_led_num = SWITCH_NUM_MAX; // 整个文件长度(文件头长度+数据长度) file_length = FILE_ADDR_ALGIN(fh.file_led_addr + fh.file_led_num * sizeof(struct file_led_res)); // 分配并初始化空间 p = rt_malloc(file_length + 2); //加crc长度 if(!p) { return -1; } memset(p,0,file_length); // 写入文件头 memcpy(p,(char *)&fh,sizeof(fh)); // 写LED状态数据 for(i=0; i