|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: File: HIDPutData.c ! 24: ! 25: Contains: xxx put contents here xxx ! 26: ! 27: Version: xxx put version here xxx ! 28: ! 29: Copyright: � 1999 by Apple Computer, Inc., all rights reserved. ! 30: ! 31: File Ownership: ! 32: ! 33: DRI: xxx put dri here xxx ! 34: ! 35: Other Contact: xxx put other contact here xxx ! 36: ! 37: Technology: xxx put technology here xxx ! 38: ! 39: Writers: ! 40: ! 41: (BWS) Brent Schorsch ! 42: ! 43: Change History (most recent first): ! 44: ! 45: <USB1> 3/5/99 BWS first checked in ! 46: */ ! 47: ! 48: #include "HIDLib.h" ! 49: ! 50: //#include <stdio.h> ! 51: ! 52: /* ! 53: *------------------------------------------------------------------------------ ! 54: * ! 55: * HIDPutData - Put a single data item to a report ! 56: * ! 57: * Input: ! 58: * psReport - The report ! 59: * iReportLength - The length of the report ! 60: * iStart - Start Bit in report ! 61: * iSize - Number of Bits ! 62: * iValue - The data ! 63: * Output: ! 64: * Returns: ! 65: * kHidP_Success - Success ! 66: * kHidP_NullPointer - Argument, Pointer was Null ! 67: * ! 68: *------------------------------------------------------------------------------ ! 69: */ ! 70: OSStatus ! 71: HIDPutData (void * report, ! 72: ByteCount reportLength, ! 73: UInt32 start, ! 74: UInt32 size, ! 75: SInt32 value) ! 76: { ! 77: Byte * psReport = report; ! 78: SInt32 data, iShiftedData; ! 79: UInt32 iStartByte, startBit; ! 80: UInt32 iLastByte, iLastBit; ! 81: UInt32 iStartMask, iLastMask; ! 82: UInt32 iDataMask; ! 83: /* ! 84: * Report ! 85: * Bit 28 27 26 25 24 | 23 22 21 20 19 18 17 16 | 15 14 13 12 11 10 09 ... ! 86: * Last Byte (3) | | Byte 2 | | Start Byte (1) ! 87: * Data x x x d d | d d d d d d d d | d d y y y y y ! 88: * Last Bit (1) / | | \ Start Bit (6) ! 89: * ... 1 1 1 0 0 | Intermediate | 0 0 1 1 1 1 1 ... ! 90: * Last Mask | Byte(s) | StartMask ! 91: */ ! 92: iLastByte = (start + size - 1)/8; ! 93: /* ! 94: * Check the parameters ! 95: */ ! 96: if ((start < 0) || (size <= 0) || (iLastByte >= reportLength)) ! 97: return kHIDBadParameterErr; ! 98: iLastBit = (start + size - 1)&7; ! 99: iLastMask = ~((1<<(iLastBit+1)) - 1); ! 100: iStartByte = start/8; ! 101: startBit = start&7; ! 102: iStartMask = (1<<startBit) - 1; ! 103: /* ! 104: * If the data is contained in one byte then ! 105: * handle it differently ! 106: * Mask off just the area where the new data goes ! 107: * Shift the data over to its new location ! 108: * Mask the data for its new location ! 109: * Or in the data ! 110: */ ! 111: if (iStartByte == iLastByte) ! 112: { ! 113: data = psReport[iStartByte]; ! 114: iDataMask = iStartMask | iLastMask; ! 115: data &= iDataMask; ! 116: iShiftedData = value << startBit; ! 117: iShiftedData &= ~iDataMask; ! 118: data |= iShiftedData; ! 119: } ! 120: /* ! 121: * If the data is in more than one byte then ! 122: * Do the start byte first ! 123: * Mask off the bits where the new data goes ! 124: * Shift the new data over to the start of field ! 125: * Or the two together and store back out ! 126: */ ! 127: else ! 128: { ! 129: data = psReport[iStartByte]; ! 130: data &= iStartMask; ! 131: iShiftedData = value << startBit; ! 132: data |= iShiftedData; ! 133: psReport[iStartByte] = (Byte) data; ! 134: value >>= 8; ! 135: /* ! 136: * Store out an intermediate bytes ! 137: */ ! 138: while (++iStartByte < iLastByte) ! 139: { ! 140: psReport[iStartByte] = (Byte) value; ! 141: value >>= 8; ! 142: } ! 143: /* ! 144: * Mask off the bits where the new data goes ! 145: * Mask off the bits in the new data where the old goes ! 146: * Or the two together and store back out ! 147: */ ! 148: data = psReport[iLastByte]; ! 149: data &= iLastMask; ! 150: value &= ~iLastMask; ! 151: data |= value; ! 152: } ! 153: /* ! 154: * Store out the last or only Byte ! 155: */ ! 156: psReport[iStartByte] = (Byte) data; ! 157: return kHIDSuccess; ! 158: } ! 159:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.