⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 owfile.c

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 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 + -