AM243x MCU+ SDK  08.02.00
tiescbsp.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Texas Instruments Incorporated
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef TIESC_BSP_H_
34 #define TIESC_BSP_H_
35 
92 /* ========================================================================== */
93 /* Include Files */
94 /* ========================================================================== */
95 
96 #ifndef DISABLE_UART_PRINT
97 #include <stdio.h>
98 #endif
99 
100 #include <industrial_comms/ethercat_slave/icss_fwhal/tiesc_pruss_intc_mapping.h>
101 #include <drivers/pruicss.h>
102 #include <industrial_comms/ethercat_slave/icss_fwhal/tiesc_def.h>
103 
104 #ifdef __cplusplus
105 extern "C" {
106 #endif
107 
108 /* ========================================================================== */
109 /* Macros & Typedefs */
110 /* ========================================================================== */
111 
112 
117 #define TIESC_MAX_FRAME_SIZE (0x7CF)
118 
119 /*Single datagram accessing contiguous multiple FMMU mapped areas in a single slave for process data
120 is supported now by TI ESC firmware.
121 Process path latency in TI ESC is high when this support is active
122 For specific use cases (4SM with 3 FMMUs or multiple FMMUs (in a given ESC) are not accessed in a single datagram)
123 process path latency improvement can be achieved by disabling below define */
124 #define ENABLE_MULTIPLE_SM_ACCESS_IN_SINGLE_DATAGRAM 0
125 
126 #define MAX_SYNC_MAN 8
127 #define SIZEOF_SM_REGISTER 8
128 
129 #define TIESC_EEPROM_SIZE 0x800
130 
131 #define MAILBOX_WRITE 0
132 #define MAILBOX_READ 1
133 #define PROCESS_DATA_OUT 2
134 #define PROCESS_DATA_IN 3
135 
136 #define MBX_WRITE_EVENT ((uint16_t) 0x0100)
137 #define MBX_READ_EVENT ((uint16_t) 0x0200)
138 
139 //Below constants are not defined in esc.h
140 #define ESC_ADDR_REV_TYPE 0x000
141 #define ESC_ADDR_BUILD 0x002
142 
143 #define ESC_ADDR_CONFIG_STATION_ALIAS 0x012
144 #define ESC_ADDR_DLSTATUS 0x110
145 #define ESC_ADDR_ALCONTROL 0x120
146 #define ESC_ADDR_ALSTATUS 0x130
147 #define ESC_ADDR_PDI_CONTROL 0x140
148 #define ESC_PDI_CONTROL_ELD_ALL_PORTS_MASK (1 << 1)
149 #define ESC_ADDR_PDI_CONFIG 0x150
150 #define ESC_ADDR_AL_EVENT_MASK 0x204
151 #define ESC_ADDR_AL_EVENT_REQ 0x220
152 #define ESC_ADDR_SM_WD_STATUS 0x440
153 #define ESC_ADDR_EEPROM_CTRL 0x502
154 #define ESC_ADDR_MI_ECAT_ACCESS 0x516
155 #define ESC_ADDR_MI_PDI_ACCESS 0x517
156 
157 #define ESC_EEPROM_CMD_MASK 0x0700 //Description (0x502.8:10): Command bit mask
158 #define ESC_EEPROM_CMD_READ_MASK 0x0100 //Description (0x502.8): Currently executed read command
159 #define ESC_EEPROM_CMD_WRITE_MASK 0x0200 //Description (0x502.9): Initialize Write Command
160 #define ESC_EEPROM_CMD_RELOAD_MASK 0x0400 //Description (0x502.10): Trigger EEPROM reload
161 #define ESC_EEPROM_ERROR_MASK 0x7800 //Description : Mask all EEPROM error bits; Checksum error (0x0502.11); EEPROM not loaded (0x0502.12); Missing EEPROM Acknowledge (0x0502.13); Write Error (0x0502.14)
162 #define ESC_EEPROM_ERROR_CRC 0x0800 //Description (0x502.11): EEPROM CRC Error
163 #define ESC_EEPROM_ERROR_CMD_ACK 0x2000 //Description (0x502.13): EEPROM Busy
164 #define ESC_EEPROM_BUSY_MASK 0x8000 //Description (0x502.15): EEPROM Busy
165 
166 #define ESC_ADDR_SYNCMAN 0x800
167 
168 #define ESC_ADDR_SM1_STATUS 0x80D
169 #define SM_STATUS_MBX_FULL 0x08
170 
171 #define ESC_ADDR_SM0_STATUS 0x805
172 #define ESC_ADDR_SM0_ACTIVATE 0x806
173 #define ESC_ADDR_SM1_ACTIVATE 0x806+8
174 #define ESC_ADDR_SM2_ACTIVATE 0x806+8*2
175 #define ESC_ADDR_SM3_ACTIVATE 0x806+8*3
176 #define ESC_ADDR_SM4_ACTIVATE 0x806+8*4
177 #define ESC_ADDR_SM5_ACTIVATE 0x806+8*5
178 #define ESC_ADDR_SM6_ACTIVATE 0x806+8*6
179 #define ESC_ADDR_SM7_ACTIVATE 0x806+8*7
180 #define ESC_ADDR_SM0_PDI_CONTROL 0x807
181 #define ESC_ADDR_SM1_PDI_CONTROL 0x807+8
182 #define ESC_ADDR_SM2_PDI_CONTROL 0x807+8*2
183 #define ESC_ADDR_SM3_PDI_CONTROL 0x807+8*3
184 #define ESC_ADDR_SM4_PDI_CONTROL 0x807+8*4
185 #define ESC_ADDR_SM5_PDI_CONTROL 0x807+8*5
186 #define ESC_ADDR_SM6_PDI_CONTROL 0x807+8*6
187 #define ESC_ADDR_SM7_PDI_CONTROL 0x807+8*7
188 
189 #define SM_PDI_CONTROL_SM_DISABLE 1
190 
191 #define ESC_ADDR_SYSTIME 0x910
192 #define ESC_ADDR_SYSTIME_HIGH 0x914
193 #define ESC_ADDR_SYSTIME_OFFSET 0x920
194 #define ESC_ADDR_SYSTIME_DELAY 0x928
195 #define ESC_ADDR_SPEEDCOUNTER_START 0x930
196 #define ESC_ADDR_TIMEDIFF_FILTDEPTH 0x934
197 #define ESC_ADDR_SPEEDDIFF_FILTDEPTH 0x935
198 #define ESC_ADDR_SYNC_PULSE_LENGTH 0x982
199 #define ESC_ADDR_SYNC_STATUS 0x98E
200 #define ESC_ADDR_LATCH0_CONTROL 0x9A8
201 #define ESC_ADDR_LATCH1_CONTROL 0x9A9
202 #define ESC_ADDR_LATCH0_POS_EDGE 0x9B0
203 #define ESC_ADDR_LATCH0_NEG_EDGE 0x9B8
204 #define ESC_ADDR_LATCH1_POS_EDGE 0x9C0
205 #define ESC_ADDR_LATCH1_NEG_EDGE 0x9C8
206 #define ESC_ADDR_TI_PORT0_ACTIVITY 0xE00
207 #define ESC_ADDR_TI_PORT1_ACTIVITY 0xE04
208 #define ESC_ADDR_TI_PORT0_PHYADDR 0xE08
209 #define ESC_ADDR_TI_PORT1_PHYADDR 0xE09
210 #define ESC_ADDR_TI_PDI_ISR_PINSEL 0xE0A
211 #define ESC_ADDR_TI_PHY_LINK_POLARITY 0XE0C
212 #define ESC_ADDR_TI_PORT0_TX_START_DELAY 0xE10
213 #define ESC_ADDR_TI_PORT1_TX_START_DELAY 0xE12
214 #define ESC_ADDR_TI_ESC_RESET 0xE14
215 #define ESC_ADDR_TI_EDMA_LATENCY_ENHANCEMENT 0xE24
216 #define TI_ESC_RST_CMD_U 0x545352
217 #define TI_ESC_RST_CMD_L 0x747372
218 
219 #define ESC_ADDR_MEMORY 0x1000
220 
221 #define CMD_DL_USER_CLEAR_AL_EVENT_HIGH 0x0
222 #define CMD_DL_USER_GET_BUFFER_READ_ADDR 0x1
223 #define CMD_DL_USER_GET_BUFFER_WRITE_ADDR 0x2
224 #define CMD_DL_USER_SET_BUFFER_WRITE_DONE 0x3
225 
229 #define CMD_DL_USER_ACK_MBX_READ 0x4
230 
234 #define CMD_DL_USER_ACK_MBX_WRITE 0x5
235 
239 #define CMD_DL_USER_EEPROM_CMD_ACK 0x6
240 
244 #define CMD_DL_USER_READ_SYNC_STATUS 0x7
245 #define SYNC0 0
246 #define SYNC1 1
247 
251 #define CMD_DL_USER_READ_AL_CONTROL 0x8
252 
256 #define CMD_DL_USER_WRITE_AL_STATUS 0x9
257 
261 #define CMD_DL_USER_READ_PD_WD_STATUS 0xA
262 
266 #define CMD_DL_USER_READ_SM_ACTIVATE 0xB
267 
271 #define CMD_DL_USER_WRITE_SM_PDI_CTRL 0xC
272 
276 #define CMD_DL_USER_READ_LATCH_TIME 0xD
277 #define LATCH0_POS_EDGE 0
278 #define LATCH0_NEG_EDGE 1
279 #define LATCH1_POS_EDGE 2
280 #define LATCH1_NEG_EDGE 3
281 
286 #define CMD_DL_USER_READ_SYS_TIME 0xE
287 
291 #define CMD_DL_USER_CLEAR_AL_EVENT_LOW 0xF
292 #ifdef SYSTEM_TIME_PDI_CONTROLLED
293 
297 #define CMD_DL_USER_SYSTIME_PDI_CONTROL 0x10
298 #define WRITE_SYSTIME 0
299 #define WRITE_SYSTIME_OFFSET 1
300 #define WRITE_FILTER_CONFIG 2
301 #endif
302 
303 #define SWAPWORD
304 #define SWAPDWORD
305 
306 #define ICSS_MDIO_USRPHYSEL_LINKINT_ENABLE 0x40
307 #define ICSS_MDIO_USRPHYSEL_LINKSTAT_MLINK 0x80
308 
309 #define TIESC_PERM_RW 0x0
310 #define TIESC_PERM_WRITE_ONLY 0x1
311 #define TIESC_PERM_READ_ONLY 0x2
312 
313 #define TIESC_PERM_WRITE TIESC_PERM_WRITE_ONLY
314 #define TIESC_PERM_READ TIESC_PERM_READ_ONLY
315 
316 #define PDI_PERM_RW 0x0
317 #define PDI_PERM_READ_ONLY 0x1
318 
319 #define PDI_PERM_WRITE PDI_PERM_RW
320 #define PDI_PERM_READ PDI_PERM_READ_ONLY
321 
322 #define TIESC_MDIO_CLKDIV 79 //For 2.5MHz MDIO clock: 200/(TIESC_MDIO_CLKDIV+1)
323 
324 #define TIESC_MDIO_RX_LINK_DISABLE 0 //Slow MDIO state m/c based link detection
325 #define TIESC_MDIO_RX_LINK_ENABLE 1 //Fast link detect using RXLINK forward from PHY to MDIO MLINK
326 #define TIESC_LINK_POL_ACTIVE_LOW 1
327 #define TIESC_LINK_POL_ACTIVE_HIGH 0
328 
333 #define PDI_WD_TRIGGER_RX_SOF (0 << 4)
334 
339 #define PDI_WD_TRIGGER_LATCH_IN (1 << 4)
340 
345 #define PDI_WD_TRIGGER_SYNC0_OUT (2 << 4)
346 
351 #define PDI_WD_TRIGGER_SYNC1_OUT (3 << 4)
352 
353 #if ENABLE_MULTIPLE_SM_ACCESS_IN_SINGLE_DATAGRAM
354 #define TIESC_PORT0_TX_DELAY 0xA0
355 #else
356 #define TIESC_PORT0_TX_DELAY 0x50
357 #endif
358 #define TIESC_PORT1_TX_DELAY 0x50
359 
360 #define PDI_ISR_EDIO_NUM 7 //GPMC_CSN(2) -> pr1_edio_data_out7 for ICEv2.J4.Pin21
361 
362 /* PDI side register protection using register permission table (4KB) in memory - disable if you care for performance and memory foot print */
363 /* #define ENABLE_PDI_REG_PERMISSIONS */
364 
365 /* Use ESC system time instead of SYS/BIOS Timestamp_get32 for timing info */
366 #define USE_ECAT_TIMER
367 
368 
369 /* Uncomment following to enable DC feature of system time compensation via PDI interface instead of ECAT interface
370  for synchronizing two independent EtherCAT networks */
371 //#define SYSTEM_TIME_PDI_CONTROLLED
372 /*Comment to following to enable PDI ISR and SYNC ISR in HWI context */
373 #define ENABLE_PDI_TASK
374 #define ENABLE_SYNC_TASK
375 
382 /* #define SUPPORT_CMDACK_POLL_MODE */
383 
384 #if defined (__aarch64__)
385 #define ASSERT_DMB() __asm__(" dmb ISH")
386 #define ASSERT_DSB() __asm__(" dsb ISH")
387 #else
388 #define ASSERT_DMB() __asm__(" dmb")
389 #define ASSERT_DSB() __asm__(" dsb")
390 #endif
391 
392 #ifdef USE_ECAT_TIMER
393 #define ECAT_TIMER_INC_P_MS 1000000
394 #else
395 #define ECAT_TIMER_INC_P_MS ecat_timer_inc_p_ms /* ARM frequency: Will be detected during bsp_init*/
396 extern volatile uint32_t ecat_timer_inc_p_ms;
397 #endif
398 
399 #define ESC_SYSTEMTIME_OFFSET_OFFSET 0x0920
400 #define ESC_SPEED_COUNTER_START_OFFSET 0x0930
401 #define ESC_DC_START_TIME_CYCLIC_OFFSET 0x0990
402 
403 #define DRIFTCTRL_TASK_SYNC_ZERO_CROSS_ADJUST 0xE0 //PRU_DMEM0
404 
409 #define LOCK_PD_BUF_AVAILABLE_FOR_HOST 0
410 
414 #define LOCK_PD_BUF_HOST_ACCESS_START 1
415 
419 #define LOCK_PD_BUF_HOST_ACCESS_FINISH 2
420 
427 #define LOCK_PD_BUF_CHECK_AVAILABILITY_RETRY_COUNT (10U)
428 
429 typedef int32_t (*bsp_eeprom_read_t)(uint8_t *buf, uint32_t len);
430 typedef int32_t (*bsp_eeprom_write_t)(uint8_t *buf, uint32_t len);
431 typedef void (*bsp_init_spinlock_t)(void);
432 typedef uint32_t (*bsp_hwspinlock_lock_t)(int num);
433 typedef void (*bsp_hwspinlock_unlock_t)(int num);
434 typedef void (*bsp_ethphy_init_t)(PRUICSS_Handle pruIcssHandle, uint8_t phy0addr, uint8_t phy1addr, uint8_t enhancedlink_enable);
435 typedef int8_t (*bsp_get_phy_address_t)(uint8_t instance, uint8_t portNumber);
436 typedef void (*bsp_ethercat_stack_isr_function)(void);
437 
438 /* ========================================================================== */
439 /* Structure Declarations */
440 /* ========================================================================== */
441 
445 typedef struct bsp_params_s
446 {
469  uint32_t link0_polarity;
471  uint32_t link1_polarity;
473  uint32_t phy0_address;
475  uint32_t phy1_address;
477  const unsigned char *default_tiesc_eeprom;
488 } bsp_params;
489 
493 typedef struct
494 {
495  uint8_t sm_buf_index;
496  uint8_t lock_state;
497  uint16_t addr;
499 
504 typedef struct
505 {
506  uint8_t reserved1[0x90];
507  uint32_t system_time_low;
508  uint32_t system_time_high;
510  uint8_t reserved2[7];
511  uint16_t cmdlow;
512  uint16_t cmdlow_ack;
513  uint16_t param1low;
514  uint16_t param2low;
515  uint16_t resp1low;
516  uint16_t resp2low;
517 #ifndef SYSTEM_TIME_PDI_CONTROLLED
518  uint8_t reserved3[212];
519 #else
520  uint8_t reserved3[24];
521  uint32_t systime_offset_low;
522  uint32_t systime_offset_high;
523  uint8_t reserved4[180];
524 #endif
525  t_sm_processdata sm_processdata[6];
527 
531 typedef struct
532 {
533  uint8_t reserved[1024];
534  uint8_t reg_properties[4096];
536 
537 typedef struct
538 {
540  uint16_t length;
542 
546 typedef struct
547 {
548  uint16_t clkdiv;
549  uint8_t addr0;
550  uint8_t addr1;
551  uint8_t link0pol; /* LINK_MII signal polarity of PHY hooked to PRU-ICSS MII0. 1: Active lLow 0: Active High */
552  uint8_t link1pol; /* LINK_MII signal polarity of PHY hooked to PRU-ICSS MII1. 1: Active lLow 0: Active High */
554 } t_mdio_params;
555 
556 /* ========================================================================== */
557 /* Function Declarations */
558 /* ========================================================================== */
559 
569 void bsp_params_init(bsp_params *init_params);
570 
586 extern int32_t bsp_init(bsp_params *init_params);
587 
615  pruIcssHandle); //Internal API - invoked by bsp_init
616 
624 extern void bsp_start_esc_isr(PRUICSS_Handle pruIcssHandle);
625 
636 extern void bsp_exit(PRUICSS_Handle pruIcssHandle);
637 
652 extern void bsp_set_pdi_wd_trigger_mode(PRUICSS_Handle pruIcssHandle,
653  uint32_t mode);
696  uint32_t command, uint16_t param1, uint16_t param2);
711 extern void bsp_eeprom_emulation_init(void);
712 
722 extern int32_t bsp_eeprom_load_esc_registers(PRUICSS_Handle pruIcssHandle,
723  int32_t reload_flag);
724 
733 extern int32_t bsp_eeprom_emulation_reload(PRUICSS_Handle pruIcssHandle);
734 
742 
748 extern void bsp_eeprom_emulation_flush(void);
749 
755 extern void bsp_eeprom_emulation_exit(void);
756 
763 extern uint8_t *bsp_get_eeprom_cache_base(void);
764 
770 
778 
786 extern void bsp_set_eeprom_update_status(uint8_t status);
787 
795 extern uint8_t bsp_get_eeprom_update_status(void);
796 
815 extern void bsp_set_sm_properties(PRUICSS_Handle pruIcssHandle, uint8_t sm,
816  uint16_t address, uint16_t len);
828 
829 extern int16_t bsp_get_sm_index(uint16_t address, uint16_t len);
845 extern uint8_t bsp_pdi_sm_config_ongoing(PRUICSS_Handle pruIcssHandle);
858 extern void bsp_pdi_mbx_read_start(PRUICSS_Handle pruIcssHandle);
859 
865 extern void bsp_pdi_mbx_read_complete(PRUICSS_Handle pruIcssHandle);
866 
873 extern void bsp_pdi_mbx_write_start(PRUICSS_Handle pruIcssHandle);
874 
881 extern void bsp_pdi_mbx_write_complete(PRUICSS_Handle pruIcssHandle);
882 
902 extern uint16_t bsp_get_process_data_address(PRUICSS_Handle pruIcssHandle,
903  uint16_t address, uint16_t len, int16_t *p_sm_index);
904 
917  uint16_t address, uint16_t len, int16_t sm_index);
918 
935 extern uint8_t bsp_read_byte(PRUICSS_Handle pruIcssHandle, uint16_t address);
936 
947 extern uint16_t bsp_read_word(PRUICSS_Handle pruIcssHandle, uint16_t address);
948 
959 extern uint32_t bsp_read_dword(PRUICSS_Handle pruIcssHandle, uint16_t address);
960 
970 extern void bsp_read(PRUICSS_Handle pruIcssHandle, uint8_t *pdata,
971  uint16_t address,
972  uint16_t len);
973 
983 extern uint8_t bsp_read_byte_isr(PRUICSS_Handle pruIcssHandle, uint16_t address);
984 
994 extern uint16_t bsp_read_word_isr(PRUICSS_Handle pruIcssHandle,
995  uint16_t address);
996 
1006 extern uint32_t bsp_read_dword_isr(PRUICSS_Handle pruIcssHandle,
1007  uint16_t address);
1008 
1026  uint16_t address, uint16_t length);
1041 extern void bsp_pdi_write_indication(PRUICSS_Handle pruIcssHandle,
1042  uint16_t address, uint16_t length,
1043  uint16_t value);
1052 extern void bsp_write_byte(PRUICSS_Handle pruIcssHandle, uint8_t val,
1053  uint16_t address);
1054 
1063 extern void bsp_write_word(PRUICSS_Handle pruIcssHandle, uint16_t val,
1064  uint16_t address);
1065 
1074 extern void bsp_write_dword(PRUICSS_Handle pruIcssHandle, uint32_t val,
1075  uint16_t address);
1076 
1086 extern void bsp_write(PRUICSS_Handle pruIcssHandle, uint8_t *pdata,
1087  uint16_t address, uint16_t len);
1088 
1097 extern uint32_t bsp_pruss_mdioreg_read(PRUICSS_Handle pruIcssHandle,
1098  uint32_t regoffset);
1099 
1108 extern void bsp_pruss_mdioreg_write(PRUICSS_Handle pruIcssHandle, uint32_t val,
1109  uint32_t regoffset);
1110 
1119 extern uint32_t bsp_pruss_iepreg_read(PRUICSS_Handle pruIcssHandle,
1120  uint32_t regoffset);
1121 
1130 extern void bsp_pruss_iepreg_write(PRUICSS_Handle pruIcssHandle, uint32_t val,
1131  uint32_t regoffset);
1132 
1140 extern void bsp_pruss_cmd_intfc_write_word(uint16_t val, volatile uint16_t *ptr);
1141 
1149 extern uint16_t bsp_pruss_cmd_intfc_read_word(volatile uint16_t *ptr);
1150 
1160 extern uint8_t bsp_get_pdi_access_perm(uint16_t address, uint8_t access);
1161 
1171 extern uint8_t bsp_pdi_access_perm_word(uint16_t address, uint8_t access);
1172 
1182 extern uint8_t bsp_pdi_access_perm_dword(uint16_t address, uint8_t access);
1183 
1194 extern uint8_t bsp_pdi_access_perm_array(uint16_t address, uint8_t access,
1195  uint16_t size);
1196 
1204 extern void bsp_set_pdi_perm_read_only(uint16_t *perm_array, uint16_t address);
1205 
1213 extern void bsp_set_pdi_perm_read_write(uint16_t *perm_array, uint16_t address);
1214 
1225 extern uint8_t bsp_is_pdi_perm_read_only(uint16_t *perm_array, uint16_t address);
1226 
1234 
1242 
1260 extern int16_t bsp_pruss_mdio_init(PRUICSS_Handle pruIcssHandle,
1261  t_mdio_params *pmdio_params);
1262 
1273 extern int16_t bsp_pruss_mdio_phy_read(PRUICSS_Handle pruIcssHandle,
1274  uint8_t phyaddr, uint8_t regoffset, uint16_t *regval);
1275 
1286 extern int16_t bsp_pruss_mdio_phy_write(PRUICSS_Handle pruIcssHandle,
1287  uint8_t phyaddr, uint8_t regoffset, uint16_t regval);
1288 
1299 extern uint32_t bsp_pruss_mdio_phy_link_state(PRUICSS_Handle pruIcssHandle,
1300  uint8_t phyaddr);
1314 
1321 extern void bsp_set_digio_out(PRUICSS_Handle pruIcssHandle, uint8_t num);
1322 
1329 extern void bsp_clear_digio_out(PRUICSS_Handle pruIcssHandle, uint8_t num);
1330 
1340 extern void bsp_hwspinlock_init(void);
1341 
1348 extern uint32_t bsp_hwspinlock_lock(int num);
1349 
1355 extern void bsp_hwspinlock_unlock(int num);
1356 
1363 #ifdef SYSTEM_TIME_PDI_CONTROLLED
1364 
1371 extern void bsp_pdi_latch0_control(PRUICSS_Handle pruIcssHandle, uint8_t val);
1372 
1380 extern void bsp_pdi_latch1_control(PRUICSS_Handle pruIcssHandle, uint8_t val);
1381 
1388 extern void bsp_pdi_write_system_time(PRUICSS_Handle pruIcssHandle,
1389  uint32_t systime);
1396 extern void bsp_pdi_write_system_timeoffset(PRUICSS_Handle pruIcssHandle,
1397  unsigned long long systime);
1404 extern void bsp_pdi_write_systime_delay(PRUICSS_Handle pruIcssHandle,
1405  uint32_t systime);
1414 extern void bsp_pdi_write_filterconfig(PRUICSS_Handle pruIcssHandle,
1415  uint16_t speedcount_start,
1416  uint8_t speedcount_filtdepth, uint8_t systime_filtdepth);
1417 #endif
1418 
1430 extern uint32_t bsp_get_timer_register(void);
1431 
1436 extern void bsp_clear_timer_register(void);
1443 extern void bsp_get_local_sys_time(uint32_t *systime_low,
1444  uint32_t *systime_high);
1445 
1454  uint32_t *systime_low, uint32_t *systime_high);
1455 
1464  uint32_t *systime_low, uint32_t *systime_high);
1465 
1474  uint32_t *systime_low, uint32_t *systime_high);
1475 
1484  uint32_t *systime_low, uint32_t *systime_high);
1485 
1497 extern void bsp_global_mutex_lock(void);
1498 
1503 extern void bsp_global_mutex_unlock(void);
1513 void Sync0Isr(void *args);
1517 void Sync1Isr(void *args);
1521 void EcatIsr(void *args);
1522 
1523 #ifndef SUPPORT_CMDACK_POLL_MODE
1524 
1527 void EscCmdLowAckIsr(void *args);
1528 #endif
1529 
1546 extern void bsp_set_pru_firmware(uint32_t *frameProc, uint32_t frameProcLen,
1547  uint32_t *hostProc, uint32_t hostProcLen);
1554 #ifdef __cplusplus
1555 }
1556 #endif
1557 
1558 #endif/*TIESC_BSP_H_ */
bsp_set_eeprom_update_status
void bsp_set_eeprom_update_status(uint8_t status)
Indicate to FWHAL whether EEPROM is written for flushing to non-volatile storage. Typically called on...
bsp_params::phy1_address
uint32_t phy1_address
Definition: tiescbsp.h:475
t_sm_processdata::sm_buf_index
uint8_t sm_buf_index
Definition: tiescbsp.h:495
bsp_get_pdi_read_access_fail_cnt
uint32_t bsp_get_pdi_read_access_fail_cnt()
Returns the count of PDI read access failures.
bsp_hwspinlock_lock
uint32_t bsp_hwspinlock_lock(int num)
Acquire selected spinlock instance.
t_host_interface::resp2low
uint16_t resp2low
Definition: tiescbsp.h:516
bsp_pdi_post_read_indication
void bsp_pdi_post_read_indication(PRUICSS_Handle pruIcssHandle, uint16_t address, uint16_t length)
Invoked after reading a register or mailbox buffer from PDI side .
EscCmdLowAckIsr
void EscCmdLowAckIsr(void *args)
ESC CMD Low ACK IRQ Handler.
bsp_eeprom_emulation_exit
void bsp_eeprom_emulation_exit(void)
Call EEPROM flush on exit.
size
uint16_t size
Definition: tisci_boardcfg.h:1
bsp_get_latch0_posedge_time
void bsp_get_latch0_posedge_time(PRUICSS_Handle pruIcssHandle, uint32_t *systime_low, uint32_t *systime_high)
Return latch0 posedge timestamp for application use(nanosec resolution)
bsp_pdi_mbx_write_start
void bsp_pdi_mbx_write_start(PRUICSS_Handle pruIcssHandle)
Indicates to the firmware that PDI side write to read mailbox has started.
bsp_hwspinlock_lock_t
uint32_t(* bsp_hwspinlock_lock_t)(int num)
Definition: tiescbsp.h:432
bsp_global_mutex_lock
void bsp_global_mutex_lock(void)
Critical section enter API using semaphore/mutex/interrupt disable primitives from RTOS....
bsp_pdi_access_perm_dword
uint8_t bsp_pdi_access_perm_dword(uint16_t address, uint8_t access)
Checks if the PDI register [Four bytes] has the requested access permission and returns the result.
bsp_params::eeprom_pointer_for_stack
uint8_t ** eeprom_pointer_for_stack
Definition: tiescbsp.h:479
bsp_eeprom_read_t
int32_t(* bsp_eeprom_read_t)(uint8_t *buf, uint32_t len)
Definition: tiescbsp.h:429
t_host_interface::system_time_low
uint32_t system_time_low
Definition: tiescbsp.h:507
t_host_interface::cmdlow_ack
uint16_t cmdlow_ack
Definition: tiescbsp.h:512
bsp_eeprom_write_t
int32_t(* bsp_eeprom_write_t)(uint8_t *buf, uint32_t len)
Definition: tiescbsp.h:430
t_sm_processdata
Struct for host to PRU-ICSS command interface.
Definition: tiescbsp.h:494
t_mdio_params::addr0
uint8_t addr0
Definition: tiescbsp.h:549
bsp_process_data_access_complete
void bsp_process_data_access_complete(PRUICSS_Handle pruIcssHandle, uint16_t address, uint16_t len, int16_t sm_index)
This API is invoked after PDI side completes read/write to PD address returned by bsp_get_process_dat...
bsp_params::ethphy_init
bsp_ethphy_init_t ethphy_init
Definition: tiescbsp.h:464
bsp_read_word
uint16_t bsp_read_word(PRUICSS_Handle pruIcssHandle, uint16_t address)
Read a 16-bit value at 'Address' from ESC memory: SM mailbox (single buffer) mapped or register area.
t_sm_processdata::lock_state
uint8_t lock_state
Definition: tiescbsp.h:496
bsp_get_latch1_posedge_time
void bsp_get_latch1_posedge_time(PRUICSS_Handle pruIcssHandle, uint32_t *systime_low, uint32_t *systime_high)
Return latch1 posedge timestamp for application use(nanosec resolution)
pruicss.h
bsp_get_phy_address_t
int8_t(* bsp_get_phy_address_t)(uint8_t instance, uint8_t portNumber)
Definition: tiescbsp.h:435
bsp_hwspinlock_unlock
void bsp_hwspinlock_unlock(int num)
Release selected spinlock instance.
bsp_is_pdi_perm_read_only
uint8_t bsp_is_pdi_perm_read_only(uint16_t *perm_array, uint16_t address)
Checks if the PDI register [byte] has read only access permission and returns the result.
bsp_send_command_to_firmware
void bsp_send_command_to_firmware(PRUICSS_Handle pruIcssHandle, uint32_t command, uint16_t param1, uint16_t param2)
Send command and parameters from stack to firmware to perform some action based on stack state or in ...
bsp_read_byte
uint8_t bsp_read_byte(PRUICSS_Handle pruIcssHandle, uint16_t address)
Read a byte value at 'Address' from ESC memory: SM mailbox (single buffer) mapped or register area.
bsp_pdi_write_indication
void bsp_pdi_write_indication(PRUICSS_Handle pruIcssHandle, uint16_t address, uint16_t length, uint16_t value)
Invoked after writing a register or mailbox buffer from PDI side .
t_sm_properties::length
uint16_t length
Definition: tiescbsp.h:540
bsp_params_init
void bsp_params_init(bsp_params *init_params)
Initialize the members of bsp_params with default values.
t_sm_properties
Definition: tiescbsp.h:538
bsp_pruss_iepreg_write
void bsp_pruss_iepreg_write(PRUICSS_Handle pruIcssHandle, uint32_t val, uint32_t regoffset)
Write a 32-bit value from PRU-ICSS IEP register at 'regoffset'.
bsp_pruss_mdioreg_read
uint32_t bsp_pruss_mdioreg_read(PRUICSS_Handle pruIcssHandle, uint32_t regoffset)
Read a 32-bit value from PRU-ICSS MDIO register at 'regoffset'.
bsp_read_dword_isr
uint32_t bsp_read_dword_isr(PRUICSS_Handle pruIcssHandle, uint16_t address)
Read a 32-bit value at 'Address' from ESC process data memory: SM buffer (3-buffer) mapped area.
bsp_eeprom_emulation_reload
int32_t bsp_eeprom_emulation_reload(PRUICSS_Handle pruIcssHandle)
Perform reload operation after validating EEPROM CRC.
bsp_set_pdi_wd_trigger_mode
void bsp_set_pdi_wd_trigger_mode(PRUICSS_Handle pruIcssHandle, uint32_t mode)
Configure PDI WD trigger mode, PDI WD is triggered automatically by h/w on RX_SOF(port0/port1),...
bsp_eeprom_emulation_flush
void bsp_eeprom_emulation_flush(void)
Flush the EEPROM cache to non-volatile storage. Write is performed using eeprom_write callback from b...
bsp_read
void bsp_read(PRUICSS_Handle pruIcssHandle, uint8_t *pdata, uint16_t address, uint16_t len)
Read a byte array at 'address' from ESC memory.
bsp_get_process_data_address
uint16_t bsp_get_process_data_address(PRUICSS_Handle pruIcssHandle, uint16_t address, uint16_t len, int16_t *p_sm_index)
Get the actual address of the buffer for PDI side read/write from host in 3-buffer mode.
bsp_read_word_isr
uint16_t bsp_read_word_isr(PRUICSS_Handle pruIcssHandle, uint16_t address)
Read a 16-bit value at 'Address' from ESC process data memory: SM buffer (3-buffer) mapped area.
bsp_set_sm_properties
void bsp_set_sm_properties(PRUICSS_Handle pruIcssHandle, uint8_t sm, uint16_t address, uint16_t len)
Set the address, length info from register to FWHAL layer. During INIT to PREOP transition in Mailbox...
t_host_interface::system_time_high
uint32_t system_time_high
Definition: tiescbsp.h:508
bsp_params::pdi_isr
bsp_ethercat_stack_isr_function pdi_isr
Definition: tiescbsp.h:482
bsp_ethercat_stack_isr_function
void(* bsp_ethercat_stack_isr_function)(void)
Definition: tiescbsp.h:436
bsp_pruss_mdio_phy_write
int16_t bsp_pruss_mdio_phy_write(PRUICSS_Handle pruIcssHandle, uint8_t phyaddr, uint8_t regoffset, uint16_t regval)
API to write PHY register via PRU-ICSS MDIO.
bsp_params::spinlock_base_address
uint32_t spinlock_base_address
Definition: tiescbsp.h:461
t_register_properties
Struct for register permission array.
Definition: tiescbsp.h:532
bsp_get_latch1_negedge_time
void bsp_get_latch1_negedge_time(PRUICSS_Handle pruIcssHandle, uint32_t *systime_low, uint32_t *systime_high)
Return latch0 negedge timestamp for application use(nanosec resolution)
bsp_set_pru_firmware
void bsp_set_pru_firmware(uint32_t *frameProc, uint32_t frameProcLen, uint32_t *hostProc, uint32_t hostProcLen)
This function internally sets the location from which PRU firmwares can be loaded.
bsp_pdi_access_perm_word
uint8_t bsp_pdi_access_perm_word(uint16_t address, uint8_t access)
Checks if the PDI register [Two bytes] has the requested access permission and returns the result.
bsp_set_pdi_perm_read_only
void bsp_set_pdi_perm_read_only(uint16_t *perm_array, uint16_t address)
Set the PDI register [byte] access permission to read only.
t_mdio_params::enhancedlink_enable
uint8_t enhancedlink_enable
Definition: tiescbsp.h:553
value
uint32_t value
Definition: tisci_otp_revision.h:2
bsp_set_eeprom_updated_time
void bsp_set_eeprom_updated_time(void)
Set EEPROM update time.
bsp_write_byte
void bsp_write_byte(PRUICSS_Handle pruIcssHandle, uint8_t val, uint16_t address)
Write a byte value at 'address' in ESC memory.
bsp_eeprom_load_esc_registers
int32_t bsp_eeprom_load_esc_registers(PRUICSS_Handle pruIcssHandle, int32_t reload_flag)
For loading ESC registers from EEPROM during first boot/reload after validating CRC.
bsp_esc_reg_perm_init
void bsp_esc_reg_perm_init(PRUICSS_Handle pruIcssHandle)
Sets up register permissions for ECAT side access for TI ESC, if ENABLE_PDI_REG_PERMISSIONS is define...
bsp_write
void bsp_write(PRUICSS_Handle pruIcssHandle, uint8_t *pdata, uint16_t address, uint16_t len)
Write 'len' bytes from pdata to 'address' in ESC memory.
t_mdio_params::addr1
uint8_t addr1
Definition: tiescbsp.h:550
t_host_interface::resp1low
uint16_t resp1low
Definition: tiescbsp.h:515
bsp_write_word
void bsp_write_word(PRUICSS_Handle pruIcssHandle, uint16_t val, uint16_t address)
Write a 16-bit value at 'address' in ESC memory.
bsp_eeprom_emulation_command_ack
void bsp_eeprom_emulation_command_ack(PRUICSS_Handle pruIcssHandle)
Perform reload operation after validating EEPROM CRC, Wrapper API for SSC.
bsp_pruss_mdio_phy_read
int16_t bsp_pruss_mdio_phy_read(PRUICSS_Handle pruIcssHandle, uint8_t phyaddr, uint8_t regoffset, uint16_t *regval)
API to read PHY register via PRU-ICSS MDIO.
t_mdio_params::link1pol
uint8_t link1pol
Definition: tiescbsp.h:552
t_mdio_params
Struct for MDIO initialization parameters.
Definition: tiescbsp.h:547
bsp_hwspinlock_unlock_t
void(* bsp_hwspinlock_unlock_t)(int num)
Definition: tiescbsp.h:433
bsp_set_digio_out
void bsp_set_digio_out(PRUICSS_Handle pruIcssHandle, uint8_t num)
Set selected digital output pin.
bsp_get_pdi_access_perm
uint8_t bsp_get_pdi_access_perm(uint16_t address, uint8_t access)
Checks if the PDI register [byte] has the requested access permission and returns the result.
bsp_global_mutex_unlock
void bsp_global_mutex_unlock(void)
Critical section leave API using semaphore/mutex/interrupt enable primitives from RTOS....
t_host_interface::param2low
uint16_t param2low
Definition: tiescbsp.h:514
bsp_params::interrupt_offset
int32_t interrupt_offset
Definition: tiescbsp.h:449
bsp_exit
void bsp_exit(PRUICSS_Handle pruIcssHandle)
Cleanup of EtherCAT FWHAL It does following things: .
t_host_interface
Struct for host to PRU-ICSS command interface Starts at PRU0 DMEM.
Definition: tiescbsp.h:505
bsp_params::link0_polarity
uint32_t link0_polarity
Definition: tiescbsp.h:469
bsp_init
int32_t bsp_init(bsp_params *init_params)
Initialize the EtherCAT FWHAL It does following things: .
bsp_read_dword
uint32_t bsp_read_dword(PRUICSS_Handle pruIcssHandle, uint16_t address)
Read a 32-bit value at 'Address' from ESC memory: SM mailbox (single buffer) mapped or register area.
bsp_start_esc_isr
void bsp_start_esc_isr(PRUICSS_Handle pruIcssHandle)
Register IRQ handlers for various PRU-ICSS interrupts from firmware to host to clear corresponding ev...
bsp_get_timer_register
uint32_t bsp_get_timer_register(void)
Returns the time difference from last call of bsp_clear_timer_register to this bsp_get_timer_register...
bsp_get_eeprom_updated_time
uint32_t bsp_get_eeprom_updated_time(void)
Get EEPROM Updated time.
bsp_params::pruicss_handle
PRUICSS_Handle pruicss_handle
Definition: tiescbsp.h:447
bsp_pruss_cmd_intfc_write_word
void bsp_pruss_cmd_intfc_write_word(uint16_t val, volatile uint16_t *ptr)
Read a 16-bit value from PRU-ICSS IEP command interface.
t_host_interface::param1low
uint16_t param1low
Definition: tiescbsp.h:513
t_mdio_params::link0pol
uint8_t link0pol
Definition: tiescbsp.h:551
bsp_get_local_sys_time
void bsp_get_local_sys_time(uint32_t *systime_low, uint32_t *systime_high)
Return EtherCAT time base for application use.
bsp_write_dword
void bsp_write_dword(PRUICSS_Handle pruIcssHandle, uint32_t val, uint16_t address)
Write a 32-bit value at 'address' in ESC memory.
bsp_pruss_cmd_intfc_read_word
uint16_t bsp_pruss_cmd_intfc_read_word(volatile uint16_t *ptr)
Read a 16-bit value from PRU-ICSS IEP command interface.
reserved
uint16_t reserved
Definition: tisci_boardcfg_rm.h:2
bsp_pruss_iepreg_read
uint32_t bsp_pruss_iepreg_read(PRUICSS_Handle pruIcssHandle, uint32_t regoffset)
Read a 32-bit value from PRU-ICSS IEP register at 'regoffset'.
bsp_eeprom_emulation_init
void bsp_eeprom_emulation_init(void)
Initialize the EEPROM cache in volatile RAM. If the non-volatile storage has valid data(read is perfo...
bsp_pdi_access_perm_array
uint8_t bsp_pdi_access_perm_array(uint16_t address, uint8_t access, uint16_t size)
Checks if all PDI registers starting from 'address' has the requested access permission and returns t...
t_sm_processdata::addr
uint16_t addr
Definition: tiescbsp.h:497
bsp_set_pdi_perm_read_write
void bsp_set_pdi_perm_read_write(uint16_t *perm_array, uint16_t address)
Set the PDI register [byte] access permission to read and write.
mode
char mode[32]
Definition: tisci_pm_core.h:1
bsp_params::phy0_address
uint32_t phy0_address
Definition: tiescbsp.h:473
bsp_params::eeprom_write
bsp_eeprom_write_t eeprom_write
Definition: tiescbsp.h:459
bsp_clear_timer_register
void bsp_clear_timer_register(void)
Update the time when bsp_clear_timer_register last invoked. This is a wrapper API used by SSC.
Sync1Isr
void Sync1Isr(void *args)
SYNC1 IRQ Handler.
bsp_pdi_mbx_read_start
void bsp_pdi_mbx_read_start(PRUICSS_Handle pruIcssHandle)
Indicates to the firmware that PDI side read from write mailbox has started.
t_mdio_params::clkdiv
uint16_t clkdiv
Definition: tiescbsp.h:548
bsp_get_pdi_write_access_fail_cnt
uint32_t bsp_get_pdi_write_access_fail_cnt()
Returns the count of PDI write access failures.
bsp_pdi_mbx_read_complete
void bsp_pdi_mbx_read_complete(PRUICSS_Handle pruIcssHandle)
Indicates to the firmware that PDI side read from write mailbox has completed.
Sync0Isr
void Sync0Isr(void *args)
SYNC0 IRQ handler.
bsp_pruss_mdio_init
int16_t bsp_pruss_mdio_init(PRUICSS_Handle pruIcssHandle, t_mdio_params *pmdio_params)
Initializes PRU-ICSS MDIO for EtherCAT firmware to communicate with PHYs. Must be called after poweri...
bsp_pdi_mbx_write_complete
void bsp_pdi_mbx_write_complete(PRUICSS_Handle pruIcssHandle)
Indicates to the firmware that PDI side write to read mailbox has completed.
bsp_clear_digio_out
void bsp_clear_digio_out(PRUICSS_Handle pruIcssHandle, uint8_t num)
Clear selected digital output pin.
bsp_get_sm_properties
t_sm_properties * bsp_get_sm_properties(uint8_t sm)
Get the pointer to requested SM properties. It is used for Buffer/Mailbox read/write detection from H...
bsp_params::sync1_isr
bsp_ethercat_stack_isr_function sync1_isr
Definition: tiescbsp.h:486
bsp_get_eeprom_update_status
uint8_t bsp_get_eeprom_update_status(void)
Read the EEPROM update status from FWHAL. Typically called from low priority task periodically check ...
t_host_interface::cmdlow
uint16_t cmdlow
Definition: tiescbsp.h:511
bsp_params::enhancedlink_enable
uint8_t enhancedlink_enable
Definition: tiescbsp.h:466
bsp_get_sm_index
int16_t bsp_get_sm_index(uint16_t address, uint16_t len)
bsp_init_spinlock_t
void(* bsp_init_spinlock_t)(void)
Definition: tiescbsp.h:431
bsp_read_byte_isr
uint8_t bsp_read_byte_isr(PRUICSS_Handle pruIcssHandle, uint16_t address)
Read a byte value at 'Address' from ESC process data memory: SM buffer (3-buffer) mapped area.
bsp_set_digio_sw_dataout_enable
void bsp_set_digio_sw_dataout_enable(PRUICSS_Handle pruIcssHandle)
Configure digio for sw controlled dataout mode.
EcatIsr
void EcatIsr(void *args)
ECAT IRQ Handler.
bsp_ethphy_init_t
void(* bsp_ethphy_init_t)(PRUICSS_Handle pruIcssHandle, uint8_t phy0addr, uint8_t phy1addr, uint8_t enhancedlink_enable)
Definition: tiescbsp.h:434
bsp_params
Struct for FWHAL initialization Parameters.
Definition: tiescbsp.h:446
bsp_get_eeprom_cache_base
uint8_t * bsp_get_eeprom_cache_base(void)
Return pointer to volatile EEPROM cache in FWHAL for processing to access the EEPROM.
bsp_pruss_mdioreg_write
void bsp_pruss_mdioreg_write(PRUICSS_Handle pruIcssHandle, uint32_t val, uint32_t regoffset)
Write a 32-bit value from PRU-ICSS MDIO register at 'regoffset'.
bsp_params::link1_polarity
uint32_t link1_polarity
Definition: tiescbsp.h:471
bsp_pdi_sm_config_ongoing
uint8_t bsp_pdi_sm_config_ongoing(PRUICSS_Handle pruIcssHandle)
Checks whether firmware has finished updating internal state for SM configuration change initiated by...
bsp_params::sync0_isr
bsp_ethercat_stack_isr_function sync0_isr
Definition: tiescbsp.h:484
bsp_params::eeprom_read
bsp_eeprom_read_t eeprom_read
Definition: tiescbsp.h:457
t_host_interface::sm_config_ongoing
uint8_t sm_config_ongoing
Definition: tiescbsp.h:509
bsp_pruss_mdio_phy_link_state
uint32_t bsp_pruss_mdio_phy_link_state(PRUICSS_Handle pruIcssHandle, uint8_t phyaddr)
Get the link status for selected PHY, this API considers MII_link signal polarity differences and rec...
PRUICSS_Handle
struct PRUICSS_Config_s * PRUICSS_Handle
A handle that is returned from a PRUICSS_open() call. This handle is required for calling other APIs.
Definition: pruicss/g_v0/pruicss.h:234
t_sm_properties::physical_start_addr
uint16_t physical_start_addr
Definition: tiescbsp.h:539
bsp_params::default_tiesc_eeprom
const unsigned char * default_tiesc_eeprom
Definition: tiescbsp.h:477
bsp_get_latch0_negedge_time
void bsp_get_latch0_negedge_time(PRUICSS_Handle pruIcssHandle, uint32_t *systime_low, uint32_t *systime_high)
Return latch0 negedge timestamp for application use(nanosec resolution)
bsp_hwspinlock_init
void bsp_hwspinlock_init(void)
Initialize SOC spinlock, enable clocks and init spinlock instance 0 through 7 to unlocked state.