remove motor_control folder from the repository Fixes: PINDSW-5635 Signed-off-by: Naresh A <nareshk@ti.com>
559 lines
21 KiB
NASM
559 lines
21 KiB
NASM
|
|
; Copyright (C) 2022 Texas Instruments Incorporated
|
|
;
|
|
; Redistribution and use in source and binary forms, with or without
|
|
; modification, are permitted provided that the following conditions
|
|
; are met:
|
|
;
|
|
; Redistributions of source code must retain the above copyright
|
|
; notice, this list of conditions and the following disclaimer.
|
|
;
|
|
; Redistributions in binary form must reproduce the above copyright
|
|
; notice, this list of conditions and the following disclaimer in the
|
|
; documentation and/or other materials provided with the
|
|
; distribution.
|
|
;
|
|
; Neither the name of Texas Instruments Incorporated nor the names of
|
|
; its contributors may be used to endorse or promote products derived
|
|
; from this software without specific prior written permission.
|
|
;
|
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
;
|
|
|
|
CALL .macro function
|
|
JAL R8.w0, function
|
|
.endm
|
|
RET .macro
|
|
JMP R8.w0
|
|
.endm
|
|
|
|
CALL2 .macro function
|
|
JAL R8.w2, function
|
|
.endm
|
|
RET2 .macro
|
|
JMP R8.w2
|
|
.endm
|
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/
|
|
; Assembler Directives Section
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/
|
|
.sect ".text"
|
|
.retain ; Required for building .out with assembly file
|
|
.retainrefs ; Required for building .out with assembly file
|
|
.global TAMAGAWA_INIT
|
|
.global FN_SEND
|
|
.global FN_SEND_WAIT_TILL_TX_CH_BUSY
|
|
.global CALL
|
|
.global CALL2
|
|
|
|
; file: tamagawa_main.asm
|
|
;
|
|
; brief: Tamagawa protocol Interface
|
|
|
|
;************************************* includes *************************************
|
|
|
|
.include "tamagawa_icss_reg_defs.h"
|
|
.include "tamagawa_interface.h"
|
|
.include "..\..\..\..\pru_io\firmware\common\icss_regs.inc"
|
|
.include "single_ch_receive_frames.h"
|
|
.include "multi_ch_receive_frames.h"
|
|
.include "firmware_version.h"
|
|
.include "tamagawa_send.h"
|
|
.include "eeprom_read.h"
|
|
.include "eeprom_write.h"
|
|
|
|
.asg R28, SCRATCH
|
|
.asg R29, SCRATCH1
|
|
.asg R7.b0, TAMAGAWA_ENABLE_CHx
|
|
.asg c25, PRUx_DMEM
|
|
|
|
.asg R27.b0, TX_DATA0
|
|
.asg R27.b1, TX_DATA1
|
|
.asg R1.b1, TX_FRAMES
|
|
.asg R6.b0, RX_FRAMES
|
|
|
|
|
|
;**********************
|
|
;* MAIN *
|
|
;**********************
|
|
|
|
main:
|
|
;Required for the firmware_version.h file
|
|
.word ICSS_FIRMWARE_RELEASE_1, ICSS_FIRMWARE_RELEASE_2
|
|
TAMAGAWA_INIT:
|
|
|
|
;If PRU0 is defined in symbols, it will select all PRU0 CFG registers.
|
|
.if $isdefed("PRU0")
|
|
;Data Memory address for PRU0 is loaded in PRUx_DMEM
|
|
.asg PRU0_DMEM, PRUx_DMEM
|
|
.asg ICSS_CFG_PRU0_ED_CH0_CFG1, ICSS_CFG_PRUx_ED_CH0_CFG1
|
|
.asg ICSS_CFG_PRU0_ED_CH1_CFG1, ICSS_CFG_PRUx_ED_CH1_CFG1
|
|
.asg ICSS_CFG_PRU0_ED_CH2_CFG1, ICSS_CFG_PRUx_ED_CH2_CFG1
|
|
.asg ICSS_CFG_PRU0_ED_CH0_CFG0, ICSS_CFG_PRUx_ED_CH0_CFG0
|
|
.asg ICSS_CFG_PRU0_ED_CH1_CFG0, ICSS_CFG_PRUx_ED_CH1_CFG0
|
|
.asg ICSS_CFG_PRU0_ED_CH2_CFG0, ICSS_CFG_PRUx_ED_CH2_CFG0
|
|
.asg ICSS_CFG_PRU0_ED_TXCFG, ICSS_CFG_PRUx_ED_TXCFG
|
|
.asg ICSS_CFG_PRU0_ED_RXCFG, ICSS_CFG_PRUx_ED_RXCFG
|
|
.endif
|
|
|
|
;If PRU1 is defined in symbols, it will select all PRU1 CFG registers.
|
|
.if $isdefed("PRU1")
|
|
;Data Memory address for PRU1 is loaded in PRUx_DMEM
|
|
.asg PRU1_DMEM, PRUx_DMEM
|
|
.asg ICSS_CFG_PRU1_ED_CH0_CFG1, ICSS_CFG_PRUx_ED_CH0_CFG1
|
|
.asg ICSS_CFG_PRU1_ED_CH1_CFG1, ICSS_CFG_PRUx_ED_CH1_CFG1
|
|
.asg ICSS_CFG_PRU1_ED_CH2_CFG1, ICSS_CFG_PRUx_ED_CH2_CFG1
|
|
.asg ICSS_CFG_PRU1_ED_CH0_CFG0, ICSS_CFG_PRUx_ED_CH0_CFG0
|
|
.asg ICSS_CFG_PRU1_ED_CH1_CFG0, ICSS_CFG_PRUx_ED_CH1_CFG0
|
|
.asg ICSS_CFG_PRU1_ED_CH2_CFG0, ICSS_CFG_PRUx_ED_CH2_CFG0
|
|
.asg ICSS_CFG_PRU1_ED_TXCFG, ICSS_CFG_PRUx_ED_TXCFG
|
|
.asg ICSS_CFG_PRU1_ED_RXCFG, ICSS_CFG_PRUx_ED_RXCFG
|
|
.endif
|
|
|
|
; Initalize ENDAT mode
|
|
; ICSS_CFG.GPCFG1[27:26] = 1
|
|
LDI R0.b0, 4
|
|
;It will initialize Endat Mode for PRU1
|
|
SBCO &R0.b0, ICSS_CFG, ICSS_CFG_GPCFG1+3, 1
|
|
|
|
; Initialize PRUx_TAMAGAWA_CH0_CFG0/1 by clearing all channel CFG registers
|
|
ZERO &R0, 4
|
|
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH0_CFG0
|
|
SBCO &R0, ICSS_CFG, SCRATCH1.w0, 4
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH1_CFG0
|
|
SBCO &R0, ICSS_CFG, SCRATCH1.w0, 4
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH2_CFG0
|
|
SBCO &R0, ICSS_CFG, SCRATCH1.w0, 4
|
|
|
|
; clear all registers
|
|
ZERO &R0, 120
|
|
|
|
; (Channel Mask) Record channel enabled by host, save it after zeroing registers (done above)
|
|
LBCO &TAMAGAWA_ENABLE_CHx, PRUx_DMEM, TAMAGAWA_CHANNEL_CONFIG_OFFSET, 1
|
|
|
|
.if $defined("ENABLE_MULTI_CHANNEL")=0
|
|
; if no channel selected,set channel mask default to ch0
|
|
; if more than 1 channel selected,set channel mask default to ch0
|
|
AND TAMAGAWA_ENABLE_CHx, TAMAGAWA_ENABLE_CHx, 0x7
|
|
QBEQ TAMAGAWA_DEFAULT_CH, TAMAGAWA_ENABLE_CHx, 0x7
|
|
QBEQ TAMAGAWA_DEFAULT_CH, TAMAGAWA_ENABLE_CHx, 0
|
|
JMP TAMAGAWA_SKIP_DEFAULT_CH
|
|
TAMAGAWA_DEFAULT_CH:
|
|
LDI TAMAGAWA_ENABLE_CHx, 0x1
|
|
TAMAGAWA_SKIP_DEFAULT_CH:
|
|
.endif
|
|
;setting Rx and Tx clocks
|
|
TAMAGAWA_SET_CLOCK:
|
|
;Set the TX Div Factor value based on the value of RX_CLK
|
|
;div factor = 10 for RX_CLK: 8*2.5 MHz and div factor = 5 for RX_CLK: 8*5 MHz
|
|
LBCO &R0.w0, PRUx_DMEM, TAMAGAWA_RX_DIV_FACTOR_OFFSET, 2
|
|
;Set the RX Div Factor value based on the value of TX_CLK
|
|
;div factor = 80 for TX_CLK: 2.5 MHz and div factor = 40 for TX_CLK: 5 Mhz
|
|
LBCO &R0.w2, PRUx_DMEM, TAMAGAWA_TX_DIV_FACTOR_OFFSET , 2
|
|
;8x oversample rate
|
|
LBCO &R1.b0, PRUx_DMEM, TAMAGAWA_OVERSAMPLE_RATE_OFFSET , 1
|
|
;Set clock to 2.5Mhz or 5MHz
|
|
CALL FN_SET_TX_CLK
|
|
|
|
TAMAGAWA_SKIP_INIT_SUCCESS:
|
|
LDI R0.b0, 1
|
|
;Initialization successful status update ends here
|
|
SBCO &R0.b0, PRUx_DMEM, TAMAGAWA_INTFC_CMD_STATUS_OFFSET, 1
|
|
LBCO &R0.b0, PRUx_DMEM, TAMAGAWA_OPMODE_CONFIG_OFFSET, 1
|
|
;If opmode=1, Host trigger is done
|
|
;If opmode=0, Periodic trigger is done
|
|
QBNE HANDLE_HOST_TRIGGER_MODE, R0.b0, 0
|
|
|
|
HANDLE_HOST_TRIGGER_MODE:
|
|
;If Host Trigger=1, request made by R5F to Firmware, now Firmware do processing and when done set trigger to 0 so that R5F application can act further.
|
|
LBCO &R0.b0, PRUx_DMEM, TAMAGAWA_INTFC_CMD_TRIGGER_OFFSET, 1
|
|
;wait till host trigger is set to 1.
|
|
QBEQ HANDLE_HOST_TRIGGER_MODE, R0.b0, 0
|
|
;load Tx data which will be loaded in Tx FIFO.
|
|
LBCO &TX_DATA0, PRUx_DMEM, TAMAGAWA_WORD_0_OFFSET, 1
|
|
;load Tx data which will be loaded in Tx FIFO.
|
|
LBCO &TX_DATA1, PRUx_DMEM, TAMAGAWA_WORD_0_OFFSET+1, 1
|
|
;load Tx frames expected
|
|
LBCO &TX_FRAMES , PRUx_DMEM, TAMAGAWA_WORD_1_OFFSET, 1
|
|
; load Rx frames expected
|
|
LBCO &RX_FRAMES , PRUx_DMEM, TAMAGAWA_WORD_1_OFFSET+1 , 1
|
|
;Call SEND RECEIVE FUNCTION
|
|
CALL FN_SEND_RECEIVE_TAMAGAWA
|
|
|
|
TAMAGAWA_HOST_CMD_END:
|
|
LDI R3.w0, 0
|
|
;Clear Host Trigger
|
|
SBCO &R3.b0, PRUx_DMEM, TAMAGAWA_INTFC_CMD_TRIGGER_OFFSET, 1
|
|
;Handle next Position request by user.
|
|
JMP HANDLE_HOST_TRIGGER_MODE
|
|
|
|
|
|
;******************************************************************************************************************************************************
|
|
; Function: FN_SEND_RECEIVE_TAMAGAWA
|
|
;
|
|
; Brief:
|
|
; 1.Select Channels
|
|
; 2.Load Tx fifo for currently selected channel by using EEPROM_READ_MACRO, EEPROM_WRITE_MACRO and TAMAGAWA_SEND_MACRO for EEPROM Read, EEPROM Write and non-EEPROM commands respectively.
|
|
; 3.Perform step 2 till all channels which are enabled are selected and their Tx FIFO is loaded.
|
|
; 4.Call FN_SEND to transmit Fifo data in different modes based on the command.
|
|
; 5.Receive data. For multi-channel, RECEIVE_FRAMES_M macro is called. For single channel, RECEIVE_FRAMES_S macro is called.
|
|
; 6.Transfer Rx data stored in Channel Registers to Tamagawa Interface variable having offset- TAMAGAWA_CHx_POSITION_DATA_WORD0_OFFSET
|
|
; Registers:
|
|
; R26.b3: Holds the value of the command id
|
|
; R30.w2: For Select Channel
|
|
; R30.b0: Load Tx fifo for selected channel
|
|
;
|
|
; Parameters:
|
|
; R11-R24: Registers used in macros for Rx data.
|
|
; R2.b1 : Rx Dataframe size
|
|
; R4.b1 : bytes_filled level
|
|
; R4.b2 : flag(explained further)
|
|
;
|
|
; *********************************************************************************************************************************************************
|
|
|
|
|
|
FN_SEND_RECEIVE_TAMAGAWA:
|
|
;Select Channel (R30[17:16] tx_ch_sel) to push data into respective Tx Fifo.
|
|
;R30[17:16] tx_ch_sel=0 :Channel 0 selected
|
|
; =1: Channel 1 selected
|
|
; =2: Channel 2 selected
|
|
;If channel 0 is asked by user,continue further
|
|
QBBC TAMAGAWA_SKIP25_CH0, TAMAGAWA_ENABLE_CHx, 0
|
|
;Select Channel 0
|
|
LDI R30.w2, TAMAGAWA_TX_CH0_SEL
|
|
TAMAGAWA_SKIP25_CH0:
|
|
;If channel 1 is asked by user,continue further
|
|
QBBC TAMAGAWA_SKIP25_CH1, TAMAGAWA_ENABLE_CHx, 1
|
|
;Select Channel 1
|
|
LDI R30.w2, TAMAGAWA_TX_CH1_SEL
|
|
TAMAGAWA_SKIP25_CH1:
|
|
;If channel 2 is asked by user,continue further
|
|
QBBC TAMAGAWA_SKIP25_CH2, TAMAGAWA_ENABLE_CHx, 2
|
|
;Select Channel 2
|
|
LDI R30.w2, TAMAGAWA_TX_CH2_SEL
|
|
TAMAGAWA_SKIP25_CH2:
|
|
;Clear the R10 register to store the channel number
|
|
ZERO &R10, 4
|
|
;Store the channel number from R30.b2 to R10.b0
|
|
MOV R10.b0, R30.b2
|
|
|
|
;Clear the R25 and R26 registers
|
|
ZERO &R25, 8
|
|
;Load the value of the type of command into R26.b3
|
|
LBCO &R26.b3, PRUx_DMEM, TAMAGAWA_EEPROM_CMD_OFFSET, 1
|
|
;If the command is EEPROM Read, jump to EEPROM_READ and continue forward
|
|
QBEQ EEPROM_READ, R26.b3, EEPROM_READ_CMD_ID
|
|
;If the command is EEPROM Write, jump to EEPROM_READ and continue forward
|
|
QBEQ EEPROM_WRITE, R26.b3, EEPROM_WRITE_CMD_ID
|
|
|
|
FN_SEND_START:
|
|
TAMAGAWA_SEND_MACRO TX_DATA0, TX_DATA1
|
|
;Jump to the end of section where we send Tx data
|
|
JMP TX_END
|
|
|
|
EEPROM_READ:
|
|
EEPROM_READ_MACRO TAMAGAWA_ENABLE_CHx, PRUx_DMEM
|
|
;Jump to the end of section where we send Tx data
|
|
JMP TX_END
|
|
|
|
EEPROM_WRITE:
|
|
EEPROM_WRITE_MACRO TAMAGAWA_ENABLE_CHx, PRUx_DMEM
|
|
|
|
TX_END:
|
|
|
|
;R11-R24 used for Rx
|
|
ZERO &R11, 60
|
|
ZERO &R3, 4
|
|
ZERO &R5, 4
|
|
AND R6,R6, 0xFF
|
|
AND R7,R7, 0xFF
|
|
;dataframe size(8 in tamagawa)
|
|
LDI R2.b1, 8
|
|
;bytes_filled (no. of frames or bytes received)
|
|
LDI R4.b1, 0
|
|
;flag for loading last register for respective channels(initially 1)
|
|
LDI R4.b2, 1
|
|
|
|
.if $defined("ENABLE_MULTI_CHANNEL")
|
|
MULTI_CHANNEL_RECEIVE:
|
|
;enable Rx for channel 0
|
|
SET R30,R30.t24
|
|
;enable Rx for channel 1
|
|
SET R30,R30.t25
|
|
;enable Rx for channel 2
|
|
SET R30,R30.t26
|
|
|
|
RECEIVE_FRAMES_M R2.b1 ,R4.b1 , RX_FRAMES , R4.b2 , SCRATCH, SCRATCH1,TAMAGAWA_ENABLE_CHx,PRUx_DMEM
|
|
CH0_RX_TO_INTERFACE:
|
|
;If channel 0 enabled,then load Rx data to tamagawa interface
|
|
QBBC CH1_RX_TO_INTERFACE, TAMAGAWA_ENABLE_CHx,0
|
|
;storing Channel 0 Rx data to Tamagawa Interface created in R5F application
|
|
SBCO &R16, PRUx_DMEM, TAMAGAWA_CH0_POSITION_DATA_WORD0_OFFSET, 12
|
|
CH1_RX_TO_INTERFACE:
|
|
;If channel 0 enabled,then load Rx data to tamagawa interface
|
|
QBBC CH2_RX_TO_INTERFACE, TAMAGAWA_ENABLE_CHx,1
|
|
;storing Channel 1 Rx data to Tamagawa Interface created in R5F application
|
|
SBCO &R19, PRUx_DMEM, TAMAGAWA_CH1_POSITION_DATA_WORD0_OFFSET, 12
|
|
CH2_RX_TO_INTERFACE:
|
|
;If channel 0 enabled,then load Rx data to tamagawa interface
|
|
QBBC INTERFACE_LOADED, TAMAGAWA_ENABLE_CHx,2
|
|
;storing Channel 2 Rx data to Tamagawa Interface created in R5F application
|
|
SBCO &R22, PRUx_DMEM, TAMAGAWA_CH2_POSITION_DATA_WORD0_OFFSET, 12
|
|
|
|
INTERFACE_LOADED:
|
|
|
|
.else
|
|
SINGLE_CHANNEL_RECEIVE:
|
|
ZERO &R3,4
|
|
CHECK_CH0:
|
|
;If channel 0 enabled, start Rx for channel 0
|
|
QBBC CHECK_CH1, TAMAGAWA_ENABLE_CHx,0
|
|
;enable Rx for channel 0
|
|
SET R30,R30.t24
|
|
;4 is mid bit no. for rx oversample data for channel 0
|
|
RECEIVE_FRAMES_S R2.b1,R4.b1,RX_FRAMES,R4.b2,SCRATCH, SCRATCH1,0x1,4,R3.b0,PRUx_DMEM,TAMAGAWA_CH0_CRC_OFFSET
|
|
;storing Channel 0 Rx data to Tamagawa Interface created in R5F application
|
|
SBCO &R16, PRUx_DMEM, TAMAGAWA_CH0_POSITION_DATA_WORD0_OFFSET, 12
|
|
CHECK_CH1:
|
|
;If channel 1 enabled, start Rx for channel 1
|
|
QBBC CHECK_CH2, TAMAGAWA_ENABLE_CHx,1
|
|
;enable Rx for channel 1
|
|
SET R30,R30.t25
|
|
; 4+8 is mid bit no. for rx oversample data for channel 1
|
|
RECEIVE_FRAMES_S R2.b1,R4.b1,RX_FRAMES,R4.b2,SCRATCH, SCRATCH1,0x2,4+8,R3.b0,PRUx_DMEM,TAMAGAWA_CH1_CRC_OFFSET
|
|
;storing Channel 1 Rx data to Tamagawa Interface created in R5F application
|
|
SBCO &R16, PRUx_DMEM, TAMAGAWA_CH1_POSITION_DATA_WORD0_OFFSET, 12
|
|
CHECK_CH2:
|
|
;If channel 0 enabled, start Rx for channel 2
|
|
QBBC ALL_CHANNEL_DONE, TAMAGAWA_ENABLE_CHx,2
|
|
;enable Rx for channel 2
|
|
SET R30,R30.t26
|
|
; 4+16 is mid bit no. for rx oversample data for channel 2
|
|
RECEIVE_FRAMES_S R2.b1,R4.b1,RX_FRAMES,R4.b2,SCRATCH, SCRATCH1,0x4,4+16,R3.b0,PRUx_DMEM,TAMAGAWA_CH2_CRC_OFFSET
|
|
;storing Channel 2 Rx data to Tamagawa Interface created in R5F application
|
|
SBCO &R16, PRUx_DMEM, TAMAGAWA_CH2_POSITION_DATA_WORD0_OFFSET, 12
|
|
ALL_CHANNEL_DONE:
|
|
|
|
.endif
|
|
|
|
RET
|
|
|
|
|
|
|
|
;****************************************************************************************************
|
|
; Function: FN_SEND
|
|
;
|
|
; Brief:
|
|
; 1.Select Rx,Tx frames size based on the command id
|
|
; 2.Wait till Tx is busy for particular channel
|
|
; 3.For triggering Tx to transmit FIFO data, CHANNEL_GO is set for single channel, GLOBAL_GO is set for multi channel
|
|
; Registers:
|
|
; ICSS_CFG_PRUx_ED_CHx_CFG0[15:11] - for selecting Tx frame size
|
|
; ICSS_CFG_PRUx_ED_CHx_CFG0[27:16] - for selecting Rx frame size
|
|
; ICSS_CFG_PRUx_ED_TXCFG - for asserting Tx Go to issue new Tx frame
|
|
; R31 - For setting CHANNEL_GO and GLOBAL_GO
|
|
; Parameters:
|
|
; R2.w1 : Rx frame size
|
|
;
|
|
; ***************************************************************************************************
|
|
|
|
FN_SEND:
|
|
; Program tx_frame_size ICSS_CFG_PRUx_ED_CH0_CFG0[15:11] to 10
|
|
; Program rx_frame_size in ICSS_CFG_PRUx_ED_CH0_CFG0[27:16] to 110
|
|
; loading rx frame size to maximum bits we can receive from tamagawa encoder for a particular command ID
|
|
LDI R2.w1 , 110
|
|
; if channel 0 is enabled, updation of frame sizes will be done.
|
|
QBBC TAMAGAWA_SKIP15_CH0, TAMAGAWA_ENABLE_CHx, 0
|
|
;loading PRUx_ED_CFG0 Register for updating Tx frame size
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH0_CFG0+1
|
|
LBCO &R2.b0, ICSS_CFG, SCRATCH1.w0, 1
|
|
;In order to clear the previous value of Tx frame size
|
|
AND R2.b0 , R2.b0 , BIT_CLEAR_MASK
|
|
;In case of non-EEPROM commands, use single shot mode with Tx frame size = 10
|
|
QBEQ SINGLESHOT10_CH0, R26.b3, NON_EEPROM_CMD_ID
|
|
;In case of EEPROM Read command, use single shot mode with Tx frame size = 30
|
|
QBEQ SINGLESHOT30_CH0, R26.b3, EEPROM_READ_CMD_ID
|
|
;In case of EEPROM Write command, use the Tx Continuous FIFO loading
|
|
QBEQ CONTINUOUS_MODE0, R26.b3, EEPROM_WRITE_CMD_ID
|
|
SINGLESHOT10_CH0:
|
|
;10 is used for selecting Tx frame size for channel 0
|
|
OR R2.b0 , R2.b0 , (NON_EEPROM_TX_FRAME_SIZE<<3)
|
|
JMP TXSIZE0_END
|
|
|
|
SINGLESHOT30_CH0:
|
|
;30 is used for selecting Tx frame size for channel 0
|
|
OR R2.b0 , R2.b0 , (EEPROM_READ_TX_FRAME_SIZE<<3)
|
|
JMP TXSIZE0_END
|
|
|
|
CONTINUOUS_MODE0:
|
|
;In case of EEPROM Write Command, use Tx Continuous FIFO loading
|
|
AND R2.b0 , R2.b0 , (EEPROM_WRITE_TX_FRAME_SIZE<<3)
|
|
TXSIZE0_END:
|
|
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH0_CFG0+1
|
|
; store Tx frame size to ICSS_CFG_PRUx_ED_CH0 for channel 0
|
|
SBCO &R2, ICSS_CFG, SCRATCH1.w0, 1
|
|
;Loading Rx frame size
|
|
MOV SCRATCH.w0, R2.w1
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH0_CFG0+2
|
|
;store rx frame size for channel 0 in ICSS_CFG_PRUx_ED_CH0
|
|
SBCO &SCRATCH.w0, ICSS_CFG, SCRATCH1.w0, 2
|
|
|
|
TAMAGAWA_SKIP15_CH0:
|
|
; if channel 1 is enabled, updation of frame sizes will be done.
|
|
QBBC TAMAGAWA_SKIP15_CH1, TAMAGAWA_ENABLE_CHx, 1
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH1_CFG0+1
|
|
LBCO &R2.b0, ICSS_CFG, SCRATCH1.w0, 1
|
|
|
|
;In order to clear the previous value of Tx frame size
|
|
AND R2.b0 , R2.b0 , BIT_CLEAR_MASK
|
|
;In case of non-EEPROM commands, use single shot mode with Tx frame size = 10
|
|
QBEQ SINGLESHOT10_CH1, R26.b3, NON_EEPROM_CMD_ID
|
|
;In case of EEPROM Read command, use single shot mode with Tx frame size = 30
|
|
QBEQ SINGLESHOT30_CH1, R26.b3, EEPROM_READ_CMD_ID
|
|
;In case of EEPROM Write command, use the Tx Continuous FIFO loading
|
|
QBEQ CONTINUOUS_MODE1, R26.b3, EEPROM_WRITE_CMD_ID
|
|
|
|
SINGLESHOT10_CH1:
|
|
;10 is used for selecting Tx frame size for channel 1
|
|
OR R2.b0 , R2.b0 , (NON_EEPROM_TX_FRAME_SIZE<<3)
|
|
JMP TXSIZE1_END
|
|
|
|
SINGLESHOT30_CH1:
|
|
;30 is used for selecting Tx frame size for channel 1
|
|
OR R2.b0 , R2.b0 , (EEPROM_READ_TX_FRAME_SIZE<<3)
|
|
JMP TXSIZE1_END
|
|
|
|
CONTINUOUS_MODE1:
|
|
;In case of EEPROM Write Command, use Tx Continuous FIFO loading
|
|
AND R2.b0 , R2.b0 , (EEPROM_WRITE_TX_FRAME_SIZE<<3)
|
|
TXSIZE1_END:
|
|
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH1_CFG0+1
|
|
; store Tx frame size to ICSS_CFG_PRUx_ED_CH1 for channel 1
|
|
SBCO &R2, ICSS_CFG, SCRATCH1.w0, 1
|
|
|
|
MOV SCRATCH.w0, R2.w1
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH1_CFG0+2
|
|
;store rx frame size for channel 1 in ICSS_CFG_PRUx_ED_CH1
|
|
SBCO &SCRATCH.w0, ICSS_CFG, SCRATCH1.w0, 2
|
|
|
|
TAMAGAWA_SKIP15_CH1:
|
|
; if channel 2 is enabled, updation of frame sizes will be done.
|
|
QBBC TAMAGAWA_SKIP15_CH2, TAMAGAWA_ENABLE_CHx, 2
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH2_CFG0+1
|
|
LBCO &R2.b0, ICSS_CFG, SCRATCH1.w0, 1
|
|
|
|
;In order to clear the previous value of Tx frame size
|
|
AND R2.b0 , R2.b0 , BIT_CLEAR_MASK
|
|
;In case of non-EEPROM commands, use single shot mode with Tx frame size = 10
|
|
QBEQ SINGLESHOT10_CH2, R26.b3, NON_EEPROM_CMD_ID
|
|
;In case of EEPROM Read command, use single shot mode with Tx frame size = 30
|
|
QBEQ SINGLESHOT30_CH2, R26.b3, EEPROM_READ_CMD_ID
|
|
;In case of EEPROM Write command, use the Tx Continuous FIFO loading
|
|
QBEQ CONTINUOUS_MODE2, R26.b3, EEPROM_WRITE_CMD_ID
|
|
|
|
SINGLESHOT10_CH2:
|
|
;10 is used for selecting Tx frame size for channel 2
|
|
OR R2.b0 , R2.b0 , (NON_EEPROM_TX_FRAME_SIZE<<3)
|
|
JMP TXSIZE2_END
|
|
|
|
SINGLESHOT30_CH2:
|
|
;30 is used for selecting Tx frame size for channel 2
|
|
OR R2.b0 , R2.b0 , (EEPROM_READ_TX_FRAME_SIZE<<3)
|
|
JMP TXSIZE2_END
|
|
|
|
CONTINUOUS_MODE2:
|
|
;In case of EEPROM Write Command, use Tx Continuous FIFO loading
|
|
AND R2.b0 , R2.b0 , (EEPROM_WRITE_TX_FRAME_SIZE<<3)
|
|
TXSIZE2_END:
|
|
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH2_CFG0+1
|
|
;store Tx frame size to ICSS_CFG_PRUx_ED_CH2 for channel 2
|
|
SBCO &R2, ICSS_CFG, SCRATCH1.w0, 1
|
|
|
|
MOV SCRATCH.w0, R2.w1
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_CH2_CFG0+2
|
|
;store rx frame size for channel 2 in ICSS_CFG_PRUx_ED_CH2
|
|
SBCO &SCRATCH.w0, ICSS_CFG, SCRATCH1.w0, 2
|
|
|
|
TAMAGAWA_SKIP15_CH2:
|
|
|
|
|
|
|
|
FN_SEND_WAIT_TILL_TX_CH_BUSY:
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_TXCFG
|
|
LBCO &R2.b3, ICSS_CFG, SCRATCH1.w0, 1
|
|
; Determines when you can assert tx go to issue a new TX frame
|
|
.if $defined("ENABLE_MULTI_CHANNEL")
|
|
|
|
; TODO : Assumption is that all 3 channels are enabled
|
|
AND R2.b3, R2.b3, 0xE0
|
|
QBNE FN_SEND_WAIT_TILL_TX_CH_BUSY, R2.b3, 0
|
|
.else
|
|
QBBC TAMAGAWA_SKIP17_CH0, TAMAGAWA_ENABLE_CHx, 0
|
|
; Wait till Ch0 is busy
|
|
QBBS FN_SEND_WAIT_TILL_TX_CH_BUSY, R2.b3, 5
|
|
TAMAGAWA_SKIP17_CH0:
|
|
QBBC TAMAGAWA_SKIP17_CH1, TAMAGAWA_ENABLE_CHx, 1
|
|
; Wait till Ch1 is busy
|
|
QBBS FN_SEND_WAIT_TILL_TX_CH_BUSY, R2.b3, 6
|
|
TAMAGAWA_SKIP17_CH1:
|
|
QBBC TAMAGAWA_SKIP17_CH2, TAMAGAWA_ENABLE_CHx, 2
|
|
; Wait till Ch2 is busy
|
|
QBBS FN_SEND_WAIT_TILL_TX_CH_BUSY, R2.b3, 7
|
|
TAMAGAWA_SKIP17_CH2:
|
|
.endif
|
|
|
|
.if $defined("ENABLE_MULTI_CHANNEL")
|
|
SET R31, TAMAGAWA_TX_GLOBAL_GO
|
|
.else
|
|
|
|
SET R31, TAMAGAWA_TX_CHANNEL_GO
|
|
.endif
|
|
|
|
RET2
|
|
|
|
;****************************************************************************************************
|
|
; Function: FN_SET_TX_CLK
|
|
;
|
|
; Brief: Setting clock/baud rate for Tx and Rx (currently set for 2.5MHZ/2.5Mbps)
|
|
; Registers:
|
|
; ICSS_CFG_PRUx_ED_RXCFG -for setting rx clock, selecting ICSSG clock(200Mhz)
|
|
; ICSS_CFG_PRUx_ED_TXCFG - for setting tx clock
|
|
; Parameters:
|
|
; R0.w0 - DIV for RX_CLK
|
|
; R0.w2 - DIV for TX_CLK
|
|
; R1.b0 - Oversample rate for RX
|
|
;
|
|
; ***************************************************************************************************
|
|
|
|
FN_SET_TX_CLK:
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_RXCFG+2
|
|
;div factor for rx = 10 or 5 based on the baud rate (value written in register is 9 or 4 respectively)
|
|
SBCO &R0.w0, ICSS_CFG, SCRATCH1.w0, 2
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_TXCFG+2
|
|
;div factor for tx =80 or 40 based on the baud rate(value written in register is 79 or 40 respectively)
|
|
SBCO &R0.w2, ICSS_CFG, SCRATCH1.w0, 2
|
|
LDI SCRATCH1.w0, ICSS_CFG_PRUx_ED_RXCFG
|
|
|
|
; For using ICSSG clock(200Mhz)
|
|
SET R1.t4
|
|
|
|
; Update ICSSG clock and oversampling value
|
|
SBCO &R1.b0, ICSS_CFG, SCRATCH1.w0, 1
|
|
RET
|