示例#1
0
/**
 * Read a page packet from a memory bank and print in hex
 *
 * bank  PagedMemoryBank to read a page from
 * portnum port number
 * SNum    The serial number of the device to read.
 * pg  page to read
 *
 * @return 'true' if the bank page packet was dumped.
 */
SMALLINT dumpBankPagePacket(SMALLINT bank, int portnum, uchar SNum[8], int pg)
{
   uchar  read_buf[64];
   uchar  extra_buf[32];
   int    read_rslt;
   int    i;

   // read a page packet (use the most verbose method)
   if(owHasExtraInfo(bank,SNum))
   {
      if(!owReadPagePacketExtra(bank,portnum,&SNum[0],pg,FALSE,
                                &read_buf[0],&read_rslt,&extra_buf[0]))
         return FALSE;
   }
   else
      if(!owReadPagePacket(bank,portnum,&SNum[0],pg,FALSE,&read_buf[0],&read_rslt))
         return FALSE;

   printf("Packet %d, len %d\n",pg,read_rslt);
   for(i=0;i<read_rslt;i++)
      printf("%02X ",read_buf[i]);
   printf("\n");

   if(owHasExtraInfo(bank,SNum))
   {
      printf("Extra: ");
      for(i=0;i<owGetExtraInfoLength(bank,SNum);i++)
         printf("%02X ",extra_buf[i]);
      printf("\n");
   }

   return TRUE;
}
示例#2
0
/**
 * Read a page from a memory bank and print in hex
 *
 * bank    MemoryBank to read a page from
 * portnum port number
 * SNum    The serial number of the device to read.
 * pg      page to read
 *
 * @return 'true' if the bank page was dumped.
 */
SMALLINT dumpBankPage (SMALLINT bank, int portnum, uchar SNum[8], int pg)
{
   uchar read_buf[64];
   uchar extra_buf[32];
   int i;
   int result;

   // read a page (use the most verbose and secure method)
   if (owHasPageAutoCRC(bank,SNum))
   {
      if(owHasExtraInfo(bank,SNum))
         result = owReadPageExtraCRC(bank,portnum,&SNum[0],
                     pg,&read_buf[0],&extra_buf[0]);
      else
         result = owReadPageCRC(bank,portnum,&SNum[0],pg,&read_buf[0]);
   }
   else
   {
      if(owHasExtraInfo(bank,SNum))
         result = owReadPageExtra(bank,portnum,&SNum[0],
                     pg,FALSE,&read_buf[0],&extra_buf[0]);
      else
         result = owReadPage(bank,portnum,&SNum[0],pg,FALSE,&read_buf[0]);
   }

   if(!result)
      return FALSE;

   printf("Page %d:  ",pg);

   for(i=0;i<owGetPageLength(bank,SNum);i++)
      printf("%02X ",read_buf[i]);
   printf("\n");

   if(owHasExtraInfo(bank,SNum))
   {
      printf("Extra: ");
      for(i=0;i<owGetExtraInfoLength(bank,SNum);i++)
         printf("%02X ",extra_buf[i]);
      printf("\n");
   }

   return TRUE;
}
示例#3
0
/**
 * Display the information about the current memory back provided.
 *
 * portnum port number for the device
 * SNum    serial number for the device
 */
void displayBankInformation (SMALLINT bank, int portnum, uchar SNum[8])
{
   printf("\n");
   printf("|------------------------------------------------------------------------\n");
   printf("| Bank:  %s\n",owGetBankDescription(bank,SNum));
   printf("| Size:  %d starting at physical address %d\n",owGetSize(bank,SNum),
      owGetStartingAddress(bank,SNum));
   printf("| Features:  ");

   if(owIsReadWrite(bank,portnum,SNum))
      printf("Read/Write ");

   if(owIsWriteOnce(bank,portnum,SNum))
      printf("Write-once ");

   if(owIsReadOnly(bank,portnum,SNum))
      printf("Read-only ");

   if(owIsGeneralPurposeMemory(bank,SNum))
      printf("general-purpose ");
   else
      printf("not-general-purpose ");

   if(owIsNonVolatile(bank,SNum))
      printf("non-volatile\n");
   else
      printf("volatile\n");

   if(owNeedsProgramPulse(bank,SNum))
      printf("|\tneeds-program-pulse \n");

   if(owNeedsPowerDelivery(bank,SNum))
      printf("|\tneeds-power-delivery \n");

   printf("| Pages:  %d pages of length %d bytes ",
      owGetNumberPages(bank,SNum),owGetPageLength(bank,SNum));

   if(owIsGeneralPurposeMemory(bank,SNum))
      printf("giving %d bytes Packet data payload",owGetMaxPacketDataLength(bank,SNum));

   printf("\n| Page Features:  ");

   if(owHasPageAutoCRC(bank,SNum))
      printf("page-device-CRC ");


   if(owCanRedirectPage(bank,SNum))
      printf("pages-redirectable ");

   if(owCanLockPage(bank,SNum))
      printf("pages-lockable \n");

   if((owCanLockPage(bank,SNum)) && (owCanLockRedirectPage(bank,SNum)))
      printf("|\tredirection-lockable\n");
   else if(owCanLockRedirectPage(bank,SNum))
      printf("redirection-lockable.");

   if(!owCanLockPage(bank,SNum))
      printf("\n");

   if(owHasExtraInfo(bank,SNum))
      printf("| Extra information for each page:  %s  length %d\n",
         owGetExtraInfoDesc(bank,SNum),
         owGetExtraInfoLength(bank,SNum));

   printf("|------------------------------------------------------------------------\n\n");
}
示例#4
0
文件: owpgrw.c 项目: AriZuu/OneWire
//--------------------------------------------------------------------------
// Read_Page:
//
// Read a default data structure page from the current Touch Memory.
// The record will be placed shorto a (uchar) memory location
// starting at the location poshorted to by (buf).  This function will 
// read a page out of normal memory (flag = REGMEM) or a status memory
// page out of an eprom (flag = STATUSMEM).  If the page being read is
// redirected as in an eprom device then the page value passes by referece
// is changed to match the new page.
//
// portnum    the port number of the port being used for the
//            1-Wire Network.
// SNum       the serial number for the part that the read is
//            to be done on.
// flag       tells weather to read regular memory or status memory
// buff       location for data read
// page       page number to read packet from
// len        the length of the data read
//
// return TRUE if the data was read correctly
//  
SMALLINT Read_Page(int portnum, uchar *SNum, uchar *buff, uchar flag, 
                   PAGE_TYPE *pg, int *len)
{
	SMALLINT  bank;
	PAGE_TYPE page;
   int       jobopen = FALSE;
   int       cnt = 0;
	uchar     extra[3],space;
	uchar     temp_buff[32];
	uchar     rd_buf[2];
   uchar     addpg;
   int       i;	

	
   // Are program jobs possible
   // is there a job that has been opened and is this a regular memory read
   if(isJob(portnum,SNum))
      jobopen = TRUE;
            
   // loop while redirected
   for (cnt = 0; cnt <= 256; cnt++)
   {       
      // if an program job is open then check there for page
      if(jobopen && (flag != STATUSMEM))
      {
         if(getJobData(portnum,SNum,*pg,buff,len))
         {
            return TRUE;
         }
      }

      // nope so look for page in cache
      if(FindPage(portnum,SNum,pg,flag,TRUE,buff,len,&space))  
      {
         if(*len == 0x41)
         {
            *pg = buff[0];
         }
         else if(flag != STATUSMEM)
         {
     		   return TRUE;
         }
      }

      bank = getBank(portnum,SNum,*pg,flag);
		page = getPage(portnum,SNum,*pg,flag);
			
      // nope so get it from the part      
      // if the page is in the status memory then call read status
      if (flag == STATUSMEM)
      {
      	if(owIsWriteOnce(bank,portnum,SNum) && owHasExtraInfo(bank,SNum))
      	{
      		if(!owReadPageExtraCRC(bank,portnum,SNum,page,&temp_buff[0],&extra[0]))
            {
               if(extra[0] == 0xFF)
         		   return FALSE;
            }
      	}
      	else
      	{
            if(owHasPageAutoCRC(bank,SNum))
            {
          	   if(!owReadPageCRC(bank,portnum,SNum,page,&temp_buff[0]))
                  return FALSE;
            }
            else
            {
               if(!owReadPage(bank,portnum,SNum,page,FALSE,&temp_buff[0]))
  		            return FALSE;
            }
      				
         	extra[0] = 0xFF;
         }

         if(extra[0] != 0xFF)
         {
      	   rd_buf[0] = ~extra[0];
      		addpg = AddPage(portnum,SNum,*pg,&rd_buf[0],STATUSMEM);
      		*pg = (PAGE_TYPE) rd_buf[0];      
            continue;
         }
         else
         {
            *len = 8;
            for(i=0;i<*len;i++)
               buff[i] = temp_buff[i];
            addpg = AddPage(portnum,SNum,*pg,&buff[0],STATUSMEM);
//  		   	   AddPage(portnum,SNum,*pg,&buff[0],*len);
//               AddPage(portnum,SNum,*pg,&buff[0],0x41);
            return TRUE;

         }
      }
      // else call on the regular readpack function
      else 
      {          
         *len = 0;
      	if(owIsWriteOnce(bank,portnum,SNum) && owHasExtraInfo(bank,SNum))
      	{
      		if(!owReadPagePacketExtra(bank,portnum,SNum,page,FALSE,
         										&temp_buff[0],len,&extra[0]))
            {
               if(extra[0] == 0xFF)
         		   return FALSE;
            }
      	}
      	else
      	{
            if(owHasPageAutoCRC(bank,SNum))
            {
         	   if(!owReadPageCRC(bank,portnum,SNum,page,&temp_buff[0]))
                  return FALSE;
            }
            else
            {
               if(!owReadPage(bank,portnum,SNum,page,FALSE,&temp_buff[0]))
  		            return FALSE;
            }
      				
      		extra[0] = 0xFF;
         } 
            
         if(extra[0] != 0xFF)
         {
         	rd_buf[0] = ~extra[0];
      		addpg = AddPage(portnum,SNum,*pg,&rd_buf[0],REDIRMEM);
      		*pg = (PAGE_TYPE) rd_buf[0];  
            continue;
         }
         else
         {
            if(*len > 0)
            {
               if(*len > 32)
               {
                  OWERROR(OWERROR_INVALID_PACKET_LENGTH);
                  return FALSE;
               }

               for(i=0;i<(*len);i++)
                  buff[i] = temp_buff[i];
            }
            else
            {
               if(temp_buff[0] > 32)
               {
                  OWERROR(OWERROR_INVALID_PACKET_LENGTH);
                  return FALSE;
               }

     	     	   for(i=1;i<(temp_buff[0]+1);i++)
     	   		   buff[i-1] = temp_buff[i];
               *len = temp_buff[0];
            }

            addpg = AddPage(portnum,SNum,*pg,&buff[0],*len);
            return TRUE;
         }
    	}
   }         
   
   // could not find the page
   return FALSE;
}