|
|
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.