📄 owfile.c
字号:
#define DEBUG_OW_FILE 0
#if DEBUG_OW_FILE
#include <stdio.h>
#endif
//---------------------------------------------------------------------------
// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
// OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
// Except as contained in this notice, the name of Dallas Semiconductor
// shall not be used except as stated in the Dallas Semiconductor
// Branding Policy.
//---------------------------------------------------------------------------
//
// owFile.C: Rudimentary level functions for reading and writing TMEX
// files on NVRAM iButton using the packet level functions.
//
// Version: 2.00
//
// History:
// 1.02 -> 1.03 Removed caps in #includes for Linux capatibility
// 1.03 -> 2.00 Changed 'MLan' to 'ow'. Added support for
// multiple ports.
//
#include "ownet.h"
//--------------------------------------------------------------------------
// Read a TMEX file return it in the provided buffer.
//
// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
// OpenCOM to indicate the port number.
// 'filename' - pointer to five byte filename to read where the
// the first four bytes are the name and the fifth is
// the extension (0 to 101 decimal).
// 'buf' - pointer to a buffer to place the file information into.
// This may need to be as large as 7084 bytes.
//
// Supported devices: All devices supported by owReadPacketStd
//
// Returns: >=0 success, number of bytes in the buffer
// <0 failed to read the file (error code)
//
int owReadFile(int portnum, uchar *filename, uchar *buf)
{
uchar dirpg=0,pgbuf[32],filepg=0;
char pglen;
ushort bufcnt=0,i;
#if DEBUG_OW_FILE
printf ("owReadFile: %s\n", filename);
#endif
// loop read directory pages until the file entry is found
do
{
// read a directory page
pglen = owReadPacketStd(portnum,TRUE,dirpg,pgbuf);
// check for reading error
if (pglen <= 0)
return READ_ERROR;
// if this is the first page make sure this is a directory
// structure
if ( ((dirpg == 0) &&
((pgbuf[0] != 0xAA) || (pgbuf[1] != 0) || (pglen < 7)))
||
((pglen-1) % 7) )
return INVALID_DIR;
// loop through each file entry in directory page (page 0 exception)
for (i = (dirpg == 0) ? 7 : 0; i < 28; i += 7)
{
// file entry found?
if ((filename[0] == pgbuf[i]) &&
(filename[1] == pgbuf[i+1]) &&
(filename[2] == pgbuf[i+2]) &&
(filename[3] == pgbuf[i+3]) &&
(filename[4] == (pgbuf[i+4] & 0x7F)) )
{
// get the file starting page number
filepg = pgbuf[i+5];
#if DEBUG_OW_FILE
printf ("owReadFile: file %s starts at %d\n", filename, filepg);
#endif
break;
}
}
// get the next directory page (from page pointer)
dirpg = pgbuf[pglen-1];
}
while (dirpg && (filepg == 0));
// check if file found
if (!filepg)
return NO_FILE;
// loop to read the file pages
do
{
// read a file page
pglen = owReadPacketStd(portnum,TRUE,filepg,pgbuf);
// check result of read
if (pglen <= 0) {
return READ_ERROR;
}
// append the page data to the buffer
for (i = 0; i < (pglen - 1); i++)
buf[bufcnt++] = pgbuf[i];
// get the next file page (from page pointer)
filepg = pgbuf[pglen-1];
}
while (filepg);
// return the number of data bytes read
return bufcnt;
}
//--------------------------------------------------------------------------
// Format and Write a TMEX file.
// Any previous files will be removed in the Format operation.
// The file length 'fllen' can be up to:
// 420 bytes for a DS1993
// 1736 bytes for a DS1995
// 7084 bytes for a DS1996.
//
// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
// OpenCOM to indicate the port number.
// 'filename' - pointer to five byte filename to write where the
// the first four bytes are the name and the fifth is
// the extension (0 to 101 decimal).
// 'buf' - pointer to a buffer containing the file information to write.
//
// Supported devices: DS1993, DS1994, DS1995, DS1996
//
// Returns: TRUE(1) success, device formated and file written
// <0 failed to read the file (error code)
//
//
int owFormatWriteFile(int portnum, uchar *filename, int fllen, uchar *buf)
{
uchar dummydir[] = { 0xAA, 0, 0x80, 0x01, 0, 0, 0, 0 },
newdir[] = { 0xAA, 0, 0x80, 0x01, 0, 0, 0, ' ', ' ', ' ', ' ', 0, 1, 1, 0 },
bmpg1[] = { 0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x02 },
bmpg2[] = { 0,0,0,0,0 }, pgbuf[32];
int i,numdirpgs,flpg,bmpg1len,bmpg2len,cntleft,pos,numpgs;
#if DEBUG_OW_FILE
printf ("owFormatWriteFile: %s %d\n", filename, fllen);
#endif
// calculate the number of pages needed to write the file
numpgs = (fllen / 28) + ((fllen % 28) ? 1 : 0);
// put the file in the newdirectory
for(i = 0; i < 5; i++)
newdir[i+7] = filename[i];
newdir[13] = (uchar)numpgs;
// set the directory pages for formatting device depending on the device type
switch (SerialNum[portnum][0]) //jpe
{
case 0x06: // DS1993
// check for file too big
if (numpgs > 15)
return FILE_TOO_BIG;
// set the bitmap in the directory page
for (i = 0; i < numpgs; i++)
bitacc(WRITE_FUNCTION,1,i+1,&newdir[3]);
numdirpgs = 1;
flpg = 1;
newdir[12] = (uchar)flpg;
break;
case 0x0A: // DS1995
// check for file too big
if (numpgs > 62)
return FILE_TOO_BIG;
// set to external bitmap file
newdir[2] = 0;
// set the bitmap in the first (and only) bitmap page
for (i = 0; i < numpgs; i++)
bitacc(WRITE_FUNCTION,1,i+2,&bmpg1[0]);
numdirpgs = 2;
flpg = 2;
newdir[12] = (uchar)flpg; // startpage
bmpg1len = 9;
newdir[3] = 0; // remove local bitmap
newdir[5] = 1; // bitmap start page
newdir[6] = 1; // bitmap number of pages
break;
case 0x0C: // DS1996
// check for file too big
if (numpgs > 253)
return FILE_TOO_BIG;
// set to external bitmap file
newdir[2] = 0;
// set the 3rd bitmap page in the bitmap
bitacc(WRITE_FUNCTION,1,2,&bmpg1[0]);
// set the bitmap in the first and second bitmap page
for (i = 0; i < numpgs; i++)
{
if (i <= 221)
bitacc(WRITE_FUNCTION,1,i+3,&bmpg1[0]);
else
bitacc(WRITE_FUNCTION,1,i-221,&bmpg2[0]);
}
numdirpgs = 3;
flpg = 3;
newdir[12] = (uchar)flpg; // startpage
bmpg1len = 29;
bmpg2len = 5;
newdir[3] = 0; // remove local bitmap
newdir[5] = 1; // bitmap start page
newdir[6] = 2; // bitmap number of pages
break;
default:
return WRONG_TYPE;
}
// write a dummy directory in page 0 in case we get interrupted
if (!owWritePacketStd(portnum,0,dummydir,8,FALSE,FALSE))
return WRITE_ERROR;
// loop to write the file in contiguous pages start with flpg
cntleft = fllen; // count of bytes left to write
pos = 0; // current position in the buffer to write
while (cntleft > 0)
{
// get a page of data to write
for (i = 0; i < ((cntleft > 28) ? 28 : cntleft); i++)
pgbuf[i] = buf[pos++];
// adjust the bytes left
cntleft -= i;
// set the next page pointer
pgbuf[i] = (cntleft == 0) ? 0 : flpg+1;
// write the page and check to result
if (!owWritePacketStd(portnum,flpg,pgbuf,i+1,FALSE,FALSE))
return WRITE_ERROR;
// set the next page
flpg++;
}
// now write the second bitmap page if needed
if (numdirpgs == 3)
if (!owWritePacketStd(portnum,2,bmpg2,bmpg2len,FALSE,FALSE))
return WRITE_ERROR;
// now write the first bitmap page if needed
if (numdirpgs >= 2)
if (!owWritePacketStd(portnum,1,bmpg1,bmpg1len,FALSE,FALSE))
return WRITE_ERROR;
// now write the directory page
if (!owWritePacketStd(portnum,0,newdir,15,FALSE,FALSE))
return WRITE_ERROR;
// success file written
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -