1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/***************************************************************************
* Copyright (c) 2024 Microsoft Corporation
* Copyright (c) 2026-present Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available under the
* terms of the MIT License which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** USBX Component */
/** */
/** Device Pima Class */
/** */
/**************************************************************************/
/**************************************************************************/
#define UX_SOURCE_CODE
/* Include necessary system files. */
#include "ux_api.h"
#include "ux_device_class_pima.h"
#include "ux_device_stack.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _ux_device_class_pima_object_references_set PORTABLE C */
/* 6.1.10 */
/* AUTHOR */
/* */
/* Chaoqiong Xiao, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Set object references associated with an object handle. */
/* The pima class will call the application to set the array of */
/* references. */
/* */
/* */
/* */
/* INPUT */
/* */
/* pima Pointer to pima class */
/* object_handle Object Handle */
/* */
/* OUTPUT */
/* */
/* Completion Status */
/* */
/* CALLS */
/* */
/* _ux_device_stack_transfer_request Transfer request */
/* _ux_device_stack_endpoint_stall Stall endpoint */
/* _ux_device_class_pima_response_send Send PIMA response */
/* */
/* CALLED BY */
/* */
/* Device Pima Class */
/* */
/**************************************************************************/
UINT _ux_device_class_pima_object_references_set(UX_SLAVE_CLASS_PIMA *pima,
ULONG object_handle)
{
UINT status;
UX_SLAVE_TRANSFER *transfer_request;
UCHAR *pima_data_buffer;
UCHAR *object_references;
ULONG object_references_length;
/* If trace is enabled, insert this event into the trace buffer. */
UX_TRACE_IN_LINE_INSERT(UX_TRACE_DEVICE_CLASS_PIMA_SET_OBJECT_REFERENCES, pima, object_handle, 0, 0, UX_TRACE_DEVICE_CLASS_EVENTS, 0, 0)
/* Obtain the pointer to the transfer request. */
transfer_request = &pima -> ux_device_class_pima_bulk_out_endpoint -> ux_slave_endpoint_transfer_request;
/* Obtain memory for this object info. Use the transfer request pre-allocated memory. */
pima_data_buffer = transfer_request -> ux_slave_transfer_request_data_pointer;
/* Get the data payload. */
status = _ux_device_stack_transfer_request(transfer_request, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VALUE_BUFFER_SIZE,
UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VALUE_BUFFER_SIZE);
/* Check if there was an error. If so, stall the endpoint. */
if (status != UX_SUCCESS)
{
/* Stall the endpoint. */
_ux_device_stack_endpoint_stall(pima -> ux_device_class_pima_bulk_out_endpoint);
/* Return the status. */
return(status);
}
/* Allocate the device info pointer to the beginning of the dynamic object info field. */
object_references = pima_data_buffer + UX_DEVICE_CLASS_PIMA_DATA_HEADER_SIZE;
/* Obtain the length of the data payload. */
object_references_length = transfer_request -> ux_slave_transfer_request_actual_length;
/* Ensure there is some data payload. */
if (object_references_length > UX_DEVICE_CLASS_PIMA_DATA_HEADER_SIZE)
{
/* Take out the header. */
object_references_length -= UX_DEVICE_CLASS_PIMA_DATA_HEADER_SIZE;
/* Send the object references to the application. */
status = pima -> ux_device_class_pima_object_references_set(pima, object_handle, object_references, object_references_length);
/* Check error code from application. */
if (status == UX_SUCCESS)
/* Now we return a response with success. */
_ux_device_class_pima_response_send(pima, UX_DEVICE_CLASS_PIMA_RC_OK, 0, 0, 0, 0);
else
/* We return an error. The code is passed by the application. */
_ux_device_class_pima_response_send(pima, status, 0, 0, 0, 0);
}
else
{
/* We return an error. */
_ux_device_class_pima_response_send(pima, UX_DEVICE_CLASS_PIMA_RC_INVALID_PARAMETER, 0, 0, 0, 0);
/* Status error. */
status = UX_ERROR;
}
/* Return completion status. */
return(status);
}
|