Endpoint.h 56.3 KB
Newer Older
1001
1002
1003
1004
1005
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
			 *
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
			 */
			uint8_t Endpoint_Write_Control_PStream_LE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
1006
1007

			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,
1008
			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
1009
			 *  in both failure and success states; the user is responsible for manually clearing the setup OUT to
1010
			 *  finalize the transfer via the \ref Endpoint_ClearOUT() macro.
1011
			 *
1012
1013
1014
			 *  \note This function automatically clears the control transfer's status stage. Do not manually attempt
			 *        to clear the status stage when using this routine in a control transaction.
			 *
1015
1016
1017
1018
1019
			 *  \note This routine should only be used on CONTROL type endpoints.
			 *
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
			 *           together; i.e. the entire stream data must be read or written at the one time.
			 *
1020
			 *  \ingroup Group_EndpointStreamRW
1021
			 *
1022
1023
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
1024
			 *
1025
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
1026
			 */
1027
1028
			uint8_t Endpoint_Write_Control_Stream_BE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);

1029
			/** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE().
1030
1031
1032
			 *
			 *  \note This function automatically clears the control transfer's status stage. Do not manually attempt
			 *        to clear the status stage when using this routine in a control transaction.
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
			 *
			 *  \note This routine should only be used on CONTROL type endpoints.
			 *
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
			 *           together; i.e. the entire stream data must be read or written at the one time.
			 *
			 *  \ingroup Group_EndpointStreamRW
			 *
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
			 *
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
			 */
			uint8_t Endpoint_Write_Control_EStream_BE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);

1048
			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE().
1049
1050
1051
			 *
			 *  \note This function automatically clears the control transfer's status stage. Do not manually attempt
			 *        to clear the status stage when using this routine in a control transaction.
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
			 *
			 *  \note The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
			 *
			 *  \note This routine should only be used on CONTROL type endpoints.
			 *
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
			 *           together; i.e. the entire stream data must be read or written at the one time.
			 *
			 *  \ingroup Group_EndpointStreamRW
			 *
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
			 *
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
			 */
			uint8_t Endpoint_Write_Control_PStream_BE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
1068
1069

			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,
1070
			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
1071
			 *  automatically sent after success or failure states; the user is responsible for manually sending the
1072
			 *  setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.
1073
			 *
1074
1075
1076
			 *  \note This function automatically clears the control transfer's status stage. Do not manually attempt
			 *        to clear the status stage when using this routine in a control transaction.
			 *
1077
1078
1079
1080
1081
			 *  \note This routine should only be used on CONTROL type endpoints.
			 *
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
			 *           together; i.e. the entire stream data must be read or written at the one time.
			 *
1082
			 *  \ingroup Group_EndpointStreamRW
1083
			 *
1084
1085
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
			 *  \param[in] Length  Number of bytes to send via the currently selected endpoint.
1086
			 *
1087
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
1088
			 */
1089
			uint8_t Endpoint_Read_Control_Stream_LE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
1090

1091
			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE().
1092
1093
1094
			 *
			 *  \note This function automatically clears the control transfer's status stage. Do not manually attempt
			 *        to clear the status stage when using this routine in a control transaction.
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
			 *
			 *  \note This routine should only be used on CONTROL type endpoints.
			 *
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
			 *           together; i.e. the entire stream data must be read or written at the one time.
			 *
			 *  \ingroup Group_EndpointStreamRW
			 *
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
			 *  \param[in] Length  Number of bytes to send via the currently selected endpoint.
			 *
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
			 */
			uint8_t Endpoint_Read_Control_EStream_LE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);

1110
			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,
1111
			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
1112
			 *  automatically sent after success or failure states; the user is responsible for manually sending the
1113
			 *  setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.
1114
			 *
1115
1116
1117
			 *  \note This function automatically clears the control transfer's status stage. Do not manually attempt
			 *        to clear the status stage when using this routine in a control transaction.
			 *
1118
1119
1120
1121
1122
			 *  \note This routine should only be used on CONTROL type endpoints.
			 *
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
			 *           together; i.e. the entire stream data must be read or written at the one time.
			 *
1123
			 *  \ingroup Group_EndpointStreamRW
1124
			 *
1125
1126
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
			 *  \param[in] Length  Number of bytes to send via the currently selected endpoint.
1127
			 *
1128
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
1129
			 */
1130
			uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);		
1131
			
1132
			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE().
1133
1134
1135
			 *
			 *  \note This function automatically clears the control transfer's status stage. Do not manually attempt
			 *        to clear the status stage when using this routine in a control transaction.
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
			 *
			 *  \note This routine should only be used on CONTROL type endpoints.
			 *
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
			 *           together; i.e. the entire stream data must be read or written at the one time.
			 *
			 *  \ingroup Group_EndpointStreamRW
			 *
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
			 *  \param[in] Length  Number of bytes to send via the currently selected endpoint.
			 *
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
			 */
			uint8_t Endpoint_Read_Control_EStream_BE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);		

1151
1152
1153
	/* Private Interface - For use in library only: */
	#if !defined(__DOXYGEN__)
		/* Macros: */
1154
1155
			#define Endpoint_AllocateMemory()              MACROS{ UECFG1X |=  (1 << ALLOC); }MACROE
			#define Endpoint_DeallocateMemory()            MACROS{ UECFG1X &= ~(1 << ALLOC); }MACROE
1156
1157
1158
1159
1160
1161
1162
1163
1164
			
			#define _ENDPOINT_GET_MAXSIZE(n)               _ENDPOINT_GET_MAXSIZE2(ENDPOINT_DETAILS_EP ## n)
			#define _ENDPOINT_GET_MAXSIZE2(details)        _ENDPOINT_GET_MAXSIZE3(details)
			#define _ENDPOINT_GET_MAXSIZE3(maxsize, db)    maxsize

			#define _ENDPOINT_GET_DOUBLEBANK(n)            _ENDPOINT_GET_DOUBLEBANK2(ENDPOINT_DETAILS_EP ## n)
			#define _ENDPOINT_GET_DOUBLEBANK2(details)     _ENDPOINT_GET_DOUBLEBANK3(details)
			#define _ENDPOINT_GET_DOUBLEBANK3(maxsize, db) db
			
1165
			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
				#define ENDPOINT_DETAILS_EP0               64,  true
				#define ENDPOINT_DETAILS_EP1               256, true
				#define ENDPOINT_DETAILS_EP2               64,  true
				#define ENDPOINT_DETAILS_EP3               64,  true
				#define ENDPOINT_DETAILS_EP4               64,  true
				#define ENDPOINT_DETAILS_EP5               64,  true
				#define ENDPOINT_DETAILS_EP6               64,  true
			#else
				#define ENDPOINT_DETAILS_EP0               64,  true
				#define ENDPOINT_DETAILS_EP1               64,  false
				#define ENDPOINT_DETAILS_EP2               64,  false
				#define ENDPOINT_DETAILS_EP3               64,  true
				#define ENDPOINT_DETAILS_EP4               64,  true			
			#endif

1181
1182
1183
1184
1185
1186
1187
1188
			#define Endpoint_ConfigureEndpoint(Number, Type, Direction, Size, Banks)            \
			                                    Endpoint_ConfigureEndpoint_Prv(Number,          \
			                                              ((Type << EPTYPE0) | Direction),      \
			                                              ((1 << ALLOC) | Banks |               \
			                                                (__builtin_constant_p(Size) ?       \
			                                                 Endpoint_BytesToEPSizeMask(Size) :  \
			                                                 Endpoint_BytesToEPSizeMaskDynamic(Size))))
													
1189
		/* Function Prototypes: */
1190
1191
1192
			void    Endpoint_ClearEndpoints(void);
			uint8_t Endpoint_BytesToEPSizeMaskDynamic(const uint16_t Size);
			bool    Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData);
1193
1194
			
		/* Inline Functions: */
1195
			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
1196
1197
			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
			{
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
				uint8_t  MaskVal    = 0;
				uint16_t CheckBytes = 8;
				
				while (CheckBytes < Bytes)
				{
					MaskVal++;
					CheckBytes <<= 1;
				}
				
				return (MaskVal << EPSIZE0);
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
			};

	#endif

	/* Disable C linkage for C++ Compilers: */
		#if defined(__cplusplus)
			}
		#endif
		
#endif
1218
1219

/** @} */