@@ -44,17 +44,23 @@ __attribute__((__aligned__(4))) volatile UsbHostDescriptor usb_pipe_table[USB_EP
44
44
45
45
extern void (* gpf_isr )(void );
46
46
47
-
48
- // NVM Software Calibration Area Mapping
49
- // USB TRANSN calibration value. Should be written to the USB PADCAL register.
50
- #define NVM_USB_PAD_TRANSN_POS 45
51
- #define NVM_USB_PAD_TRANSN_SIZE 5
52
- // USB TRANSP calibration value. Should be written to the USB PADCAL register.
53
- #define NVM_USB_PAD_TRANSP_POS 50
54
- #define NVM_USB_PAD_TRANSP_SIZE 5
55
- // USB TRIM calibration value. Should be written to the USB PADCAL register.
56
- #define NVM_USB_PAD_TRIM_POS 55
57
- #define NVM_USB_PAD_TRIM_SIZE 3
47
+ #if (SAML21 )
48
+ #define NVM_CALIBRATION_ADDRESS NVMCTRL_OTP5
49
+ #define NVM_USB_PAD_TRANSN_POS (13)
50
+ #define NVM_USB_PAD_TRANSP_POS (18)
51
+ #define NVM_USB_PAD_TRIM_POS (23)
52
+ #else
53
+ #define NVM_CALIBRATION_ADDRESS NVMCTRL_OTP4
54
+ #define NVM_USB_PAD_TRANSN_POS (45)
55
+ #define NVM_USB_PAD_TRANSP_POS (50)
56
+ #define NVM_USB_PAD_TRIM_POS (55)
57
+ #endif
58
+ #define USB_PAD_TRANSN_REG_POS (6)
59
+ #define NVM_USB_PAD_TRANSN_SIZE (5)
60
+ #define USB_PAD_TRANSP_REG_POS (0)
61
+ #define NVM_USB_PAD_TRANSP_SIZE (5)
62
+ #define USB_PAD_TRIM_REG_POS (12)
63
+ #define NVM_USB_PAD_TRIM_SIZE (3)
58
64
59
65
/**
60
66
* \brief Initialize the SAMD21 host driver.
@@ -112,7 +118,7 @@ void UHD_Init(void)
112
118
while (USB -> HOST .SYNCBUSY .reg == USB_SYNCBUSY_ENABLE );
113
119
114
120
/* Load Pad Calibration */
115
- pad_transn = (* ((uint32_t * )(NVMCTRL_OTP4 ) // Non-Volatile Memory Controller
121
+ pad_transn = (* ((uint32_t * )(NVM_CALIBRATION_ADDRESS ) // Non-Volatile Memory Controller
116
122
+ (NVM_USB_PAD_TRANSN_POS / 32 ))
117
123
>> (NVM_USB_PAD_TRANSN_POS % 32 ))
118
124
& ((1 << NVM_USB_PAD_TRANSN_SIZE ) - 1 );
@@ -122,9 +128,7 @@ void UHD_Init(void)
122
128
pad_transn = 5 ;
123
129
}
124
130
125
- USB -> HOST .PADCAL .bit .TRANSN = pad_transn ;
126
-
127
- pad_transp = (* ((uint32_t * )(NVMCTRL_OTP4 )
131
+ pad_transp = (* ((uint32_t * )(NVM_CALIBRATION_ADDRESS )
128
132
+ (NVM_USB_PAD_TRANSP_POS / 32 ))
129
133
>> (NVM_USB_PAD_TRANSP_POS % 32 ))
130
134
& ((1 << NVM_USB_PAD_TRANSP_SIZE ) - 1 );
@@ -134,20 +138,17 @@ void UHD_Init(void)
134
138
pad_transp = 29 ;
135
139
}
136
140
137
- USB -> HOST .PADCAL .bit .TRANSP = pad_transp ;
138
-
139
- pad_trim = (* ((uint32_t * )(NVMCTRL_OTP4 )
141
+ pad_trim = (* ((uint32_t * )(NVM_CALIBRATION_ADDRESS )
140
142
+ (NVM_USB_PAD_TRIM_POS / 32 ))
141
143
>> (NVM_USB_PAD_TRIM_POS % 32 ))
142
144
& ((1 << NVM_USB_PAD_TRIM_SIZE ) - 1 );
143
145
144
146
if (pad_trim == 0x7 ) // maximum value (7)
145
147
{
146
148
pad_trim = 3 ;
147
- }
148
-
149
- USB -> HOST .PADCAL .bit .TRIM = pad_trim ;
149
+ }
150
150
151
+ USB -> HOST .PADCAL .reg = (uint16_t )((pad_trim << USB_PAD_TRIM_REG_POS ) | (pad_transn << USB_PAD_TRANSN_REG_POS ) | (pad_transp << USB_PAD_TRANSP_REG_POS ));
151
152
152
153
/* Set the configuration */
153
154
uhd_run_in_standby ();
0 commit comments