⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flchkdef.h

📁 H3 M-system NAND flash driver in Linux OS, M-DOC driver
💻 H
📖 第 1 页 / 共 3 页
字号:
#ifndef DOCH_NO_INIT_MMU_PAGES
	#ifdef FL_NO_INIT_MMU_PAGES
		#define DOCH_NO_INIT_MMU_PAGES
	#endif /*FL_NO_INIT_MMU_PAGES*/
#endif /*DOCH_NO_INIT_MMU_PAGES*/



/*DOCH specific power mode defaults */
/*================================= */
/* by default DPD configured to:
   active mode is NORMAL, 
   after command execution, device passes immediatly to 
   IDLE mode and after timeout (100msec) to DPD mode*/
#ifndef DOCH_DPD_DEFAULT_ACTIVE_MODE
	#define DOCH_DPD_DEFAULT_ACTIVE_MODE	DOCH_WM_NORMAL_AND_AUTO_STBY		/*DOCH_WorkMode*/
#endif /*DOCH_DPD_DEFAULT_ACTIVE_MODE*/

#ifndef DOCH_DPD_DEFAULT_INACTIVE_MODE
	#define DOCH_DPD_DEFAULT_INACTIVE_MODE	DOCH_IM_IDLE_2_DPD			/*DOCH_InactiveMode*/
#endif /*DOCH_DPD_DEFAULT_INACTIVE_MODE*/

#ifndef DOCH_DPD_DEFAULT_DPD_TIMEOUT
	#define DOCH_DPD_DEFAULT_DPD_TIMEOUT	1
#endif /*DOCH_DPD_DEFAULT_DPD_TIMEOUT*/
/*================================= */
/* end of DOCH power mode settings */


/* Memory allocation */
/*===================*/
#ifndef DOCH_MALLOC
	#ifdef FL_MALLOC
		#define DOCH_MALLOC FL_MALLOC
	#endif /*FL_MALLOC*/
#endif /*DOCH_MALLOC*/

#ifndef DOCH_FREE
	#ifdef FL_FREE
		#define DOCH_FREE FL_FREE
	#endif /*FL_FREE*/
#endif /*DOCH_FREE*/

/* System init/release functions */
/*===============================*/
#ifndef DOCH_SYS_FUNC_INIT
#define DOCH_SYS_FUNC_INIT
#endif /* DOCH_SYS_FUNC_INIT */

#ifndef DOCH_SYS_FUNC_RELEASE
	#ifdef FL_SYS_FUNC_RELEASE
		#define DOCH_SYS_FUNC_RELEASE FL_SYS_FUNC_RELEASE
	#else /*FL_SYS_FUNC_RELEASE*/
		#define DOCH_SYS_FUNC_RELEASE()
	#endif /*FL_SYS_FUNC_RELEASE*/
#endif /*DOCH_SYS_FUNC_RELEASE*/

/* DMA transfer */
/*==============*/
#ifndef DOCH_DMA_CONFIG
	#ifdef FL_DMA_CONFIG
		#define DOCH_DMA_CONFIG FL_DMA_CONFIG
	#endif /*FL_DMA_CONFIG*/
#endif

#define DOCH_DMA_OPEN_CHANNEL								0
#define DOCH_DMA_CONFIG_TRANSACTION_DEVICE_TO_HOST			1
#define DOCH_DMA_FREE_CHANNEL								2    
#define DOCH_DMA_WAIT_FOR_READ_TRANSACTION_END				3
#define DOCH_DMA_WAIT_FOR_WRITE_TRANSACTION_END				4
#define DOCH_DMA_CONFIG_TRANSACTION_HOST_TO_DEVICE			5

#ifndef DOCH_DMA_PULSE_WIDTH
	#define DOCH_DMA_PULSE_WIDTH 0x001F
#endif /*DOCH_DMA_PULSE_WIDTH*/

/* DOCH_DMA_CHECK_BUFFER checks if buffer is suitable for DMA transfer*/
#ifndef DOCH_DMA_CHECK_BUFFER
	#define DOCH_DMA_CHECK_BUFFER(bufAddress, sectors)		(((FLDword)bufAddress & 0x3) == 0)
#endif /*DOCH_DMA_CHECK_BUFFER*/

/* Burst Mode */
/*============*/

#ifndef DOCH_USE_BURST_MODE_READ
	#ifdef FL_USE_BURST_MODE_READ
		#define DOCH_USE_BURST_MODE_READ
	#endif /*FL_USE_BURST_MODE_READ*/
#endif  /*DOCH_USE_BURST_MODE_READ*/

#ifdef DOCH_USE_BURST_MODE_READ

	#ifndef DOCH_HOST_ENTER_READ_BURST_MODE
		#ifdef FL_HOST_ENTER_BURST_MODE
			#define DOCH_HOST_ENTER_READ_BURST_MODE FL_HOST_ENTER_BURST_MODE();
		#else /*FL_HOST_ENTER_BURST_MODE*/
			#define DOCH_HOST_ENTER_READ_BURST_MODE
		#endif /*FL_HOST_ENTER_BURST_MODE*/
	#endif /*DOCH_HOST_ENTER_READ_BURST_MODE*/
	
	#ifndef DOCH_HOST_EXIT_READ_BURST_MODE
		#ifdef FL_HOST_EXIT_BURST_MODE
			#define DOCH_HOST_EXIT_READ_BURST_MODE	FL_HOST_EXIT_BURST_MODE();
		#else /*FL_HOST_EXIT_BURST_MODE*/
			#define DOCH_HOST_EXIT_READ_BURST_MODE
		#endif /*FL_HOST_EXIT_BURST_MODE*/
	#endif /*DOCH_HOST_EXIT_READ_BURST_MODE*/

#endif /*DOCH_USE_BURST_MODE_READ*/

#ifdef DOCH_USE_BURST_MODE_WRITE

	#ifndef DOCH_HOST_ENTER_WRITE_BURST_MODE
		#define DOCH_HOST_ENTER_WRITE_BURST_MODE
	#endif /*DOCH_HOST_ENTER_WRITE_BURST_MODE*/
	
	#ifndef DOCH_HOST_EXIT_WRITE_BURST_MODE
		#define DOCH_HOST_EXIT_WRITE_BURST_MODE
	#endif /*DOCH_HOST_EXIT_WRITE_BURST_MODE*/

#endif /*DOCH_USE_BURST_MODE_WRITE*/

#ifndef DOCH_BURST_LENGTH
	#ifdef BURST_LENGTH
		#define DOCH_BURST_LENGTH ( (((BURST_LENGTH)-2)& 0x03 ) <<11)
	#else
		#ifdef FL_USE_BURST_MODE_READ
			#ifdef FL_MIGRATION_VERSION
				#error BURST_LENGTH must be defined, when FL_USE_BURST_MODE_READ defined
			#else
				#error DOCH_BURST_LENGTH must be defined, when DOCH_USE_BURST_MODE_READ defined
			#endif /* migration*/
		#endif /*FL_USE_BURST_MODE_READ*/
	#endif /* BURST_LENGTH */
#endif /*DOCH_BURST_LENGTH*/

#ifndef DOCH_BURST_LATENCY
	#ifdef BURST_LATENCY
		#define DOCH_BURST_LATENCY ( ((BURST_LATENCY)& 0x07 )<<8) 
	#else
		#ifdef FL_USE_BURST_MODE_READ
			#ifdef FL_MIGRATION_VERSION
				#error BURST_LATENCY must be defined, when FL_USE_BURST_MODE_READ defined
			#else
				#error DOCH_BURST_LATENCY must be defined, when DOCH_USE_BURST_MODE_READ defined
			#endif /* migration*/
		#endif /*FL_USE_BURST_MODE_READ*/
	#endif /* BURST_LENGTH */
#endif /*DOCH_BURST_LATENCY*/

#ifndef DOCH_BURST_HOLD
	#ifdef BURST_HOLD
		#define DOCH_BURST_HOLD ((BURST_HOLD)<<13)
	#else
		#ifdef FL_USE_BURST_MODE_READ
			#ifdef FL_MIGRATION_VERSION
				#error BURST_HOLD must be defined, when FL_USE_BURST_MODE_READ defined
			#else
				#error DOCH_BURST_HOLD must be defined, when DOCH_USE_BURST_MODE_READ defined
			#endif /* migration*/
		#endif /*FL_USE_BURST_MODE_READ*/
	#endif /* BURST_HOLD */
#endif /*DOCH_BURST_HOLD*/

#ifndef DOCH_BURST_WAIT_STATE
	#ifdef BURST_WAIT_STATE
		#define DOCH_BURST_WAIT_STATE	( ((BURST_WAIT_STATE)&0x03 )<<4)
	#else
		#ifdef FL_USE_BURST_MODE_READ
			#ifdef FL_MIGRATION_VERSION
				#error BURST_WAIT_STATE must be defined, when FL_USE_BURST_MODE_READ defined
			#else
				#error DOCH_BURST_WAIT_STATE must be defined, when DOCH_USE_BURST_MODE_READ defined
			#endif /* migration*/
		#endif /*FL_USE_BURST_MODE_READ*/
	#endif
#endif /*DOCH_BURST_WAIT_STATE*/

/* end of BURST definitions for H3 */
/*=================================*/



/* Interrupt enabling */
/*====================*/

#define DOCH_INT_RB_DISABLED	0x00
#define DOCH_INT_RB_ENABLED		0x01

#ifndef DOCH_IRQ_RB_INIT
	#ifdef FL_IRQ_RB_INIT
		#define DOCH_IRQ_RB_INIT(wSockeNo) FL_IRQ_RB_INIT((wSockeNo))
	#else /*FL_IRQ_RB_INIT*/
		#define DOCH_IRQ_RB_INIT(wSockeNo) gDochIrqEnabled[(wSockeNo)] 
	#endif /*FL_IRQ_RB_INIT*/
#endif /*DOCH_IRQ_RB_INIT*/

/* MACRO for "Wait on Interrupt" */
/*===============================*/
#ifndef DOCH_SLEEP
	#ifdef FL_TFFS_SLEEP
		#define DOCH_SLEEP(socket, device, microseconds) FL_TFFS_SLEEP(socket, microseconds)
	#else
		#define DOCH_SLEEP(socket, device, microseconds) 
	#endif /*FL_TFFS_SLEEP*/
#endif /*DOCH_SLEEP*/

/* MACRO for notifying application that an interrupt had occurred
   and was NOT yet serviced */
/*==========================*/
#ifndef DOCH_UNSERVICED_INTERRUPT
	#define DOCH_UNSERVICED_INTERRUPT(socket, device) 	DOCH_SLEEP(socket, device, 0)
#endif /*DOCH_UNSERVICED_INTERRUPT*/


/* DOCH HW Configuration defaults */
/*================================*/

#ifndef DOCH_BURST_WRITE_MODE_DEFAULT
	#define DOCH_BURST_WRITE_MODE_DEFAULT		(DOCH_BURST_DISABLE | DOCH_BURST_HOLD_1_CLK | DOCH_BURST_LEN_4_CYC)
#endif /*DOCH_BURST_WRITE_MODE_DEFAULT*/

#ifndef DOCH_BURST_READ_MODE_DEFAULT
	#define DOCH_BURST_READ_MODE_DEFAULT		(DOCH_BURST_DISABLE | DOCH_BURST_HOLD_1_CLK | DOCH_BURST_LEN_4_CYC)
#endif /*DOCH_BURST_READ_MODE_DEFAULT*/

#ifndef DOCH_IPL_CTRL_DEFAULT
	#define DOCH_IPL_CTRL_DEFAULT				(DOCH_IPL_WRITE_DISABLE | DOCH_IPL_ALL_CS_ENABLED)
#endif /*DOCH_IPL_CTRL_DEFAULT*/

#ifndef DOCH_WARM_BOOT_CTRL_DEFAULT
	#define DOCH_WARM_BOOT_CTRL_DEFAULT			(DOCH_WARM_RST_POLARITY_HIGH | DOCH_WARM_RST_BURST_ON)
#endif /*DOCH_WARM_BOOT_CTRL_DEFAULT*/

#ifndef DOCH_POWER_DOWN_DEFAULT
	#define DOCH_POWER_DOWN_DEFAULT				(DOCH_DPD_PIN_POL_HIGH | DOCH_DPD_PIN_ENABLED | DOCH_DPD_WAKEUP_HOST_CE)
#endif /*DOCH_POWER_DOWN_DEFAULT*/

#ifndef DOCH_DMA_CTRL_DEFAULT
	#define DOCH_DMA_CTRL_DEFAULT				(DOCH_DMA_REQ_POL_LOW | DOCH_DMA_REQ_EDGE | ((DOCH_DMA_PULSE_WIDTH)<<4))
#endif /*DOCH_DMA_CTRL_DEFAULT*/

#ifndef DOCH_DMA_NEGATION_CTRL_DEFAULT
	#define DOCH_DMA_NEGATION_CTRL_DEFAULT		1
#endif /*DOCH_DMA_NEGATION_CTRL_DEFAULT*/

#ifndef DOCH_SLOCK_DEFAULT
	#define DOCH_SLOCK_DEFAULT					DOCH_SLOCK_OFF
#endif /*DOCH_SLOCK_DEFAULT*/

#ifndef DOCH_ENDIAN_CTRL_DEFAULT
	#ifdef FL_SWAP_BYTES
		#define DOCH_ENDIAN_CTRL_DEFAULT		(HIB_END_SWAP_ON)
	#else /*FL_SWAP_BYTES*/
		#define DOCH_ENDIAN_CTRL_DEFAULT		(HIB_END_SWAP_OFF)
	#endif /*FL_SWAP_BYTES*/
#endif /*DOCH_ENDIAN_CTRL_DEFAULT*/

#ifndef DOCH_OPERATION_MODE_CTRL_DEFAULT
	#define DOCH_OPERATION_MODE_CTRL_DEFAULT	(HIB_ADDR_SHIFT | HIB_NON_PIPE_ACCESS)
#endif /*DOCH_OPERATION_MODE_CTRL_DEFAULT*/


/*Max number of devices per ATA socket (defined by ATA standard)*/
#ifndef ATA_MAX_NUM_OF_DEVICES /* for mDOC H3 devices only */
	#define ATA_MAX_NUM_OF_DEVICES	2 /* should be 1 or 2 */
#endif /* ATA_MAX_NUM_OF_DEVICES */

/*If a wait is needed between identifying Dev0 and Dev1, customize DOCH_WAIT_B4_DEV1_ID*/
#ifndef DOCH_WAIT_B4_DEV1_ID
	#define DOCH_WAIT_B4_DEV1_ID
#endif /*DOCH_WAIT_B4_DEV1_ID*/

/* Delay cell configuration*/
/*
0000: No Delay
0001: 1x delay.
0011: 2x delay. 
0111: 3x delay.
*/

#ifndef	FL_IPL_DELAY_CELL_CONFIG_READ
	#define FL_IPL_DELAY_CELL_CONFIG_READ 0
#endif /*FL_IPL_DELAY_CELL_CONFIG_READ*/

#ifndef	FL_IPL_DELAY_CELL_CONFIG_WRITE
	#define FL_IPL_DELAY_CELL_CONFIG_WRITE 0
#endif /*FL_IPL_DELAY_CELL_CONFIG_READ*/


/*===========================*/
/* Access Layer Customization*/
/* --------------------------*/
/* 2 Sections:				 */
/*	- Run-Time				 */
/*	- Compile Time			 */
/*===========================*/
#ifdef DOCH_BIG_ENDIAN
#define C_16_8(a)	((FLByte)((a)>>8))
#define C_8_16(a)	(((FLWord)(a))<<8) 
#define C_16_16(a)  ((FLWord)((a)<<8) | ((a)>>8))
#else
#define C_16_8(a)	((FLByte)(a))
#define C_8_16(a)	((FLWord)(a))
#define C_16_16(a)  ((FLWord)(a))
#endif /* DOCH_BIG_ENDIAN */

#ifdef DOCH_USE_FUNC	/*Run-time*/

/* DOCH Access Layer macros */
/*==========================*/
#ifndef DOCHREAD_ATA_REG
#define DOCHREAD_ATA_REG(base, regNum)			C_16_8(pdev->halRoutines.hal_get_ata_reg(base, regNum))
#endif /*DOCHREAD_ATA_REG*/
#ifndef DOCHWRITE_ATA_REG
#define DOCHWRITE_ATA_REG(base, regNum, val)	(pdev->halRoutines.hal_set_ata_reg(base, regNum, C_8_16(val)))
#endif /*DOCHWRITE_ATA_REG*/
#ifndef DOCHREAD_CTRL_REG
#define DOCHREAD_CTRL_REG(base, regNum)			C_16_16(pdev->halRoutines.hal_get_ctrl_reg(base, regNum))
#endif /*DOCHREAD_CTRL_REG*/
#ifndef DOCHWRITE_CTRL_REG
#define DOCHWRITE_CTRL_REG(base, regNum, val)	(pdev->halRoutines.hal_set_ctrl_reg(base, regNum, C_16_16(val)))
#endif /*DOCHWRITE_CTRL_REG*/
#ifndef DOCHBLK_READ
#define DOCHBLK_READ(address, buf, sectors)		(pdev->halRoutines.hal_blk_read(address, buf, sectors))
#endif /*DOCHBLK_READ*/
#ifndef DOCHBLK_WRITE
#define DOCHBLK_WRITE(address, buf, sectors)	(pdev->halRoutines.hal_blk_write(address, buf, sectors))
#endif /*DOCHBLK_WRITE*/

#ifndef DOCHREAD_BURST
	#define DOCHREAD_BURST(base, offset, dest, sectors)
#endif /*DOCHREAD_BURST*/

#ifndef DOCHWRITE_BURST
	#define DOCHWRITE_BURST(base, offset, dest, sectors)
#endif /*DOCHWRITE_BURST*/

	/* DOCH IO Access macros */
	/*=======================*/
	#ifndef DOCHREAD_IO_WORD
		#define DOCHREAD_IO_WORD(address)					(FLREAD_IO_WORD(address))
	#endif /*DOCHREAD_IO_WORD*/

	#ifndef DOCHWRITE_IO_WORD
		#define DOCHWRITE_IO_WORD(val, address)				(FLWRITE_IO_WORD(val, address))
	#endif /*DOCHWRITE_IO_WORD*/

	#ifndef DOCHCPY_TO_IO_16_BITS
		#define DOCHCPY_TO_IO_16_BITS(win,buf,sectors)		(blk_write_using_data_reg(win, buf, sectors))
	#endif /*DOCHCPY_TO_IO_16_BITS*/

	#ifndef DOCHCPY_FROM_IO_16_BITS
		#define DOCHCPY_FROM_IO_16_BITS(win,buf,sectors)	(blk_read_using_data_reg(win, buf, sectors))
	#endif /*DOCHCPY_FROM_IO_16_BITS*/

#else  /*DOCH_USE_FUNC*/	/*Compile-Time*/
#ifdef FL_MIGRATION_VERSION
/* DOCH Access Layer macros */
/*==========================*/
#ifndef DOCHREAD_ATA_REG
#define DOCHREAD_ATA_REG(base, regNum)			C_16_8(flDirectRead16BitReg((DOCHFlash),(FLWord)(((regNum)<<1) + DOCH_CONT_REG_AREA)))
#endif /*DOCHREAD_ATA_REG*/
#ifndef DOCHWRITE_ATA_REG
#define DOCHWRITE_ATA_REG(base, regNum, val) 	flDirectWrite16BitReg((DOCHFlash),(FLWord)(((regNum)<<1) + DOCH_CONT_REG_AREA),(FLWord)(C_8_16(val)))
#endif /*DOCHWRITE_ATA_REG*/
#ifndef DOCHREAD_CTRL_REG
#define DOCHREAD_CTRL_REG(base, regNum)			C_16_16(flDirectRead16BitReg((DOCHFlash),(FLWord)(regNum)))
#endif /*DOCHREAD_CTRL_REG*/
#ifndef DOCHWRITE_CTRL_REG
#define DOCHWRITE_CTRL_REG(base, regNum, val) 	flDirectWrite16BitReg((DOCHFlash),(FLWord)(regNum),(FLWord)(C_16_16(val)))
#endif /*DOCHWRITE_CTRL_REG*/
#ifndef DOCHBLK_READ
#define DOCHBLK_READ(address, buf, sectors)		(flReadEvenNumberOfBytes((DOCHFlash),(FLWord)DOCH_DATA_PORT_AREA,(buf),((FLWord)(512*sectors))),0)
#endif /*DOCHBLK_READ*/
#ifndef DOCHBLK_WRITE
#define DOCHBLK_WRITE(address, buf, sectors) 	(flWriteEvenNumberOfBytes((DOCHFlash),(FLWord)DOCH_DATA_PORT_AREA,(buf),((FLWord)(512*sectors))),0)
#endif /*DOCHBLK_WRITE*/

#ifndef DOCHREAD_BURST
#define DOCHREAD_BURST(base, offset, dest, sectors) DOCHBLK_READ( (base)+(offset), dest, sectors)
#endif /*DOCHREAD_BURST*/

#ifndef DOCHWRITE_BURST
#define DOCHWRITE_BURST(base, offset, dest, sectors) DOCHBLK_READ( (base)+(offset), dest, sectors)
#endif /*DOCHWRITE_BURST*/


/* DOCH IO Access macros */
/*=======================*/
/* Not defined as we use legacy code */

#else /* FL_MIGRATION_VERSION */

	#ifndef DOCHREAD_ATA_REG
		#define DOCHREAD_ATA_REG(base, regNum)	\
			(FLByte)(DOCHREAD_IO_WORD((((volatile FLWord FAR0 *)base)+regNum + (DOCH_CONT_REG_AREA/2))));
	#endif /*DOCHREAD_ATA_REG*/

	#ifndef DOCHWRITE_ATA_REG
		#define DOCHWRITE_ATA_REG(base, regNum, val) \
			DOCHWRITE_IO_WORD((FLWord)val,(((volatile FLWord FAR0 *)base)+regNum + (DOCH_CONT_REG_AREA/2)));
	#endif /*DOCHWRITE_ATA_REG*/

	#ifndef DOCHREAD_CTRL_REG
		#define DOCHREAD_CTRL_REG(base, regNum)	\
			DOCHREAD_IO_WORD(base + regNum);
	#endif /*DOCHREAD_CTRL_REG*/

	#ifndef DOCHWRITE_CTRL_REG
		#define DOCHWRITE_CTRL_REG(base, regNum, val) \
			DOCHWRITE_IO_WORD((FLWord)val, (base + regNum));

	#endif /*DOCHWRITE_CTRL_REG*/

	#ifndef DOCHBLK_READ
		#define DOCHBLK_READ(address, buf, sectors) \
			DOCHCPY_FROM_IO_16_BITS(address, buf, sectors)
	#endif /*DOCHBLK_READ*/

	#ifndef DOCHBLK_WRITE
		#define DOCHBLK_WRITE(address, buf, sectors) \
			DOCHCPY_TO_IO_16_BITS(address, buf, sectors)
	#endif /*DOCHBLK_WRITE*/

	/* DOCH IO Access macros */
	/*=======================*/
	#ifndef DOCHREAD_IO_WORD
		#define DOCHREAD_IO_WORD(address)					(FLREAD_IO_WORD(address))
	#endif /*DOCHREAD_IO_WORD*/

	#ifndef DOCHWRITE_IO_WORD
		#define DOCHWRITE_IO_WORD(val, address)				(FLWRITE_IO_WORD(val, address))
	#endif /*DOCHWRITE_IO_WORD*/

	#ifndef DOCHCPY_TO_IO_16_BITS
		#define DOCHCPY_TO_IO_16_BITS(win,buf,sectors)		TFFSCPY_TO_IO_16_BITS(win,buf,(sectors<<DOCH_SECTOR_SIZE_BITS))
	#endif /*DOCHCPY_TO_IO_16_BITS*/

	#ifndef DOCHCPY_FROM_IO_16_BITS
		#define DOCHCPY_FROM_IO_16_BITS(win,buf,sectors)	TFFSCPY_FROM_IO_16_BITS(win,buf,(sectors<<DOCH_SECTOR_SIZE_BITS))
	#endif /*DOCHCPY_FROM_IO_16_BITS*/

#endif /* FL_MIGRATION_VERSION */

#endif /*DOCH_USE_FUNC*/

#ifndef DOCH_SET_WINDOW_OFFSET
	#define DOCH_SET_WINDOW_OFFSET(using8KB, baseAddr)
#endif /*DOCH_SET_WINDOW_OFFSET*/

#endif /* _FL_CHK_DEFS_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -