📄 memorybankad.java
字号:
/*--------------------------------------------------------------------------- * Copyright (C) 1999,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. *--------------------------------------------------------------------------- */package com.dalsemi.onewire.container;// importsimport com.dalsemi.onewire.OneWireException;import com.dalsemi.onewire.adapter.*;import com.dalsemi.onewire.utils.CRC16;import com.dalsemi.onewire.container.OneWireContainer;/** * Memory bank class for the DS2450. * * @version 0.00, 28 Aug 2000 * @author DS */class MemoryBankAD implements PagedMemoryBank{ //-------- //--------Static Final Variables //-------- /** * Read Memory Command */ public static final byte READ_MEMORY_COMMAND = ( byte ) 0xAA; /** * Write Memory Command */ public static final byte WRITE_MEMORY_COMMAND = ( byte ) 0x55; /** * Page length */ public static final int PAGE_LENGTH = 8; //-------- //-------- Variables //-------- /** * Reference to the OneWireContainer this bank resides on. */ protected OneWireContainer ib; /** * block of 0xFF's used for faster read pre-fill of 1-Wire blocks */ protected byte[] ffBlock; /** * Flag if read back verification is enabled in 'write()'. */ protected boolean writeVerification; /** * Flag to indicate that speed needs to be set */ protected boolean doSetSpeed; //-------- //-------- Protected Variables for MemoryBank implementation //-------- /** * Memory bank descriptions */ protected String bankDescription; /** * Memory bank usage flags */ protected boolean generalPurposeMemory; /** * Flag if memory bank is read/write */ protected boolean readWrite; /** * Flag if memory bank is write once (EPROM) */ protected boolean writeOnce; /** * Flag if memory bank is read only */ protected boolean readOnly; /** * Flag if memory bank is non volatile * (will not erase when power removed) */ protected boolean nonVolatile; /** * Starting physical address in memory bank. Needed for different * types of memory in the same logical memory bank. This can be * used to seperate them into two virtual memory banks. Example: * DS2406 status page has mixed EPROM and Volatile RAM. */ protected int startPhysicalAddress; //-------- //-------- Constructor //-------- /** * Memory bank contstuctor. Requires reference to the OneWireContainer * this memory bank resides on. */ public MemoryBankAD (OneWireContainer ibutton) { // keep reference to ibutton where memory bank is ib = ibutton; // create the ffblock (used for faster 0xFF fills) ffBlock = new byte [50]; for (int i = 0; i < 50; i++) ffBlock [i] = ( byte ) 0xFF; // defaults for Page0 of DS2450 bankDescription = "A/D Conversion read-out"; generalPurposeMemory = false; startPhysicalAddress = 0; readWrite = false; writeOnce = false; readOnly = true; nonVolatile = false; writeVerification = true; // indicate speed has not been set doSetSpeed = true; } //-------- //-------- Memory Bank methods //-------- /** * Query to see get a string description of the current memory bank. * * @return String containing the memory bank description */ public String getBankDescription () { return bankDescription; } /** * Query to see if the current memory bank is general purpose * user memory. If it is NOT then it is Memory-Mapped and writing * values to this memory will affect the behavior of the 1-Wire * device. * * @return 'true' if current memory bank is general purpose */ public boolean isGeneralPurposeMemory () { return generalPurposeMemory; } /** * Query to see if current memory bank is read/write. * * @return 'true' if current memory bank is read/write */ public boolean isReadWrite () { return readWrite; } /** * Query to see if current memory bank is write write once such * as with EPROM technology. * * @return 'true' if current memory bank can only be written once */ public boolean isWriteOnce () { return writeOnce; } /** * Query to see if current memory bank is read only. * * @return 'true' if current memory bank can only be read */ public boolean isReadOnly () { return readOnly; } /** * Query to see if current memory bank non-volatile. Memory is * non-volatile if it retains its contents even when removed from * the 1-Wire network. * * @return 'true' if current memory bank non volatile. */ public boolean isNonVolatile () { return nonVolatile; } /** * Query to see if current memory bank pages need the adapter to * have a 'ProgramPulse' in order to write to the memory. * * @return 'true' if writing to the current memory bank pages * requires a 'ProgramPulse'. */ public boolean needsProgramPulse () { return false; } /** * Query to see if current memory bank pages need the adapter to * have a 'PowerDelivery' feature in order to write to the memory. * * @return 'true' if writing to the current memory bank pages * requires 'PowerDelivery'. */ public boolean needsPowerDelivery () { return false; } /** * Query to get the starting physical address of this bank. Physical * banks are sometimes sub-divided into logical banks due to changes * in attributes. * * @return physical starting address of this logical bank. */ public int getStartPhysicalAddress () { return startPhysicalAddress; } /** * Query to get the memory bank size in bytes. * * @return memory bank size in bytes. */ public int getSize () { return PAGE_LENGTH; } /** * Set the write verification for the 'write()' method. * * @param doReadVerf true (default) verify write in 'write' * false, don't verify write (used on * Write-Once bit manipulation) */ public void setWriteVerification (boolean doReadVerf) { writeVerification = doReadVerf; } /** * Query to get the number of pages in current memory bank. * * @return number of pages in current memory bank */ public int getNumberPages () { return 1; } /** * Query to get page length in bytes in current memory bank. * * @return page length in bytes in current memory bank */ public int getPageLength () { return PAGE_LENGTH; } /** * Query to get Maximum data page length in bytes for a packet * read or written in the current memory bank. See the 'ReadPagePacket()' * and 'WritePagePacket()' methods. This method is only usefull * if the current memory bank is general purpose memory. * * @return max packet page length in bytes in current memory bank */ public int getMaxPacketDataLength () { return PAGE_LENGTH - 3; } /** * Query to see if current memory bank pages can be read with * the contents being verified by a device generated CRC. * This is used to see if the 'ReadPageCRC()' can be used. * * @return 'true' if current memory bank can be read with self * generated CRC. */ public boolean hasPageAutoCRC () { return true; } /** * Query to see if current memory bank pages when read deliver * extra information outside of the normal data space. Examples * of this may be a redirection byte, counter, tamper protection * bytes, or SHA-1 result. If this method returns true then the * methods 'ReadPagePacket()' and 'readPageCRC()' with 'extraInfo' * parameter can be used. * * @return 'true' if reading the current memory bank pages * provides extra information. * * @deprecated As of 1-Wire API 0.01, replaced by {@link #hasExtraInfo()} */ public boolean haveExtraInfo () { return false; } /** * Checks to see if this memory bank's pages deliver extra * information outside of the normal data space, when read. Examples * of this may be a redirection byte, counter, tamper protection * bytes, or SHA-1 result. If this method returns true then the * methods with an 'extraInfo' parameter can be used: * {@link #readPage(int,boolean,byte[],int,byte[]) readPage}, * {@link #readPageCRC(int,boolean,byte[],int,byte[]) readPageCRC}, and * {@link #readPagePacket(int,boolean,byte[],int,byte[]) readPagePacket}. * * @return <CODE> true </CODE> if reading the this memory bank's * pages provides extra information * * @see #readPage(int,boolean,byte[],int,byte[]) readPage(extra) * @see #readPageCRC(int,boolean,byte[],int,byte[]) readPageCRC(extra) * @see #readPagePacket(int,boolean,byte[],int,byte[]) readPagePacket(extra) * @since 1-Wire API 0.01 */ public boolean hasExtraInfo () { return false; } /** * Query to get the length in bytes of extra information that * is read when read a page in the current memory bank. See * 'hasExtraInfo()'. * * @return number of bytes in Extra Information read when reading * pages in the current memory bank. */ public int getExtraInfoLength () { return 0; } /** * Query to get a string description of what is contained in * the Extra Informationed return when reading pages in the current * memory bank. See 'hasExtraInfo()'. * * @return string describing extra information. */ public String getExtraInfoDescription () { return null; } //-------- //-------- MemoryBank I/O methods //-------- /** * Read memory in the current bank with no CRC checking (device or * data). The resulting data from this API may or may not be what is on * the 1-Wire device. It is recommends that the data contain some kind * of checking (CRC) like in the readPagePacket() method or have * the 1-Wire device provide the CRC as in readPageCRC(). readPageCRC() * however is not supported on all memory types, see 'hasPageAutoCRC()'. * If neither is an option then this method could be called more * then once to at least verify that the same thing is read consistantly. * * @param startAddr starting physical address * @param readContinue if 'true' then device read is continued without * re-selecting. This can only be used if the new * read() continious where the last one led off * and it is inside a 'beginExclusive/endExclusive' * block. * @param readBuf byte array to place read data into * @param offset offset into readBuf to place data * @param len length in bytes to read * * @throws OneWireIOException * @throws OneWireException */ public void read (int startAddr, boolean readContinue, byte[] readBuf, int offset, int len) throws OneWireIOException, OneWireException { // check if read exceeds memory if ((startAddr + len) > PAGE_LENGTH) throw new OneWireException("Read exceeds memory bank end"); // no regular read memory so must use readPageCRC int start_pg = startAddr / PAGE_LENGTH; int end_pg = ((startAddr + len) / PAGE_LENGTH) - 1; if (((startAddr + len) % PAGE_LENGTH) > 0) end_pg++; byte[] raw_buf = new byte [(end_pg - start_pg + 1) * PAGE_LENGTH];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -