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

📄 r2d_task_i_epson.c

📁 MMI层OBJ不能完全编译
💻 C
字号:
#include "r2d/lcds/i_sample/r2d_tfd_lcd.h"
#include "rvm/rvm_use_id_list.h"
#include "r2d/lcds/i_sample/lcd_if.h"
#include "dma/dma_api.h"
#include "dma/dma_message.h"
#include "r2d/lcds/i_sample/r2d_lcd_dma.h"

UINT16 tab_temp[264+1];


#ifdef R2D_USE_LCD_DMA

extern T_RVF_ADDR_ID		 r2d_addr_id;
volatile UINT8				 r2d_lcd_dma_ok					= 1;
T_DMA_CHANNEL				 r2d_lcd_dma_channel;
T_DMA_CHANNEL_PARAMETERS r2d_lcd_dma_channel_info;
UINT32						 r2d_lcd_dma_bytes_to_transfer	= 0;
volatile T_R2D_LCD_DMA_STATE r2d_lcd_dma_state				= R2D_LCD_DMA_UNINITILISED;

void r2d_dma_callback(void *response);
static E_LCD_IF_CALLBACK_RET f_lcd_if_dummy_callback (void);

#endif


void r2d_lcd_power_on(void)
{
}

void r2d_lcd_power_off(void)
{
}

void r2d_refresh(void)
{
	UINT16 i,j;
	
#ifndef _WINDOWS
	
	UINT32 v;
	UINT16 r,g,b; // Red, Green, Blue
	UINT16 ind;
	UINT16 command;
	UINT32  *p;
	
#ifdef R2D_USE_LCD_DMA
	UINT16 received_event;
	
#endif
	
	p=r2d_g_framebuffer->p_memory_words;
	
#if (R2D_REFRESH == R2D_HORIZONTAL)
    rvf_send_trace("R2D REFRESH",strlen("R2D REFRESH"), NULL_PARAM,
		RV_TRACE_LEVEL_DEBUG_HIGH, R2D_USE_ID );
	
	command = LCD_DISNOR;
	f_lcd_if_poll_write(C_LCD_IF_CS0, &(command), 1, C_LCD_IF_INSTRUCTION);
	
	command = LCD_RAMWR;
	f_lcd_if_poll_write(C_LCD_IF_CS0, &(command), 1, C_LCD_IF_INSTRUCTION);
	
	
	for(j=0;j<220;j++)
	{
		ind=0;
		for (i=0;i<88;i++) // 2 pixels managed in the loop
		{
			
			v= *p++;
			v=~v;
			
			r=(UINT16)(v&0x0000F800); // 5 bits
			r=r>>8;
			
			g=(UINT16)(v&0x000007E0); // 6 bits
			g=g<<5;
			
			tab_temp[ind++]= (r|g);
			
			b=(UINT16)(v&0x0000001F); // 5 bits
			b=b<<3;
			
			
			v=v>>16;
			
			r=(UINT16)(v&0x0000F800); // 5 bits
			
			tab_temp[ind++]= (b | r);
			
			
			g=(UINT16)(v&0x000007E0); // 6 bits
			g=g>>3;
			
			b=(UINT16)(v&0x0000001F); // 5 bits
			b=b<<11;
			
			tab_temp[ind++]= (b | g);
			
		}
		p++;
		
#ifdef R2D_USE_LCD_DMA
		if(r2d_lcd_dma_ok == 1)
		{
			UINT8 nmb_frames;
			r2d_lcd_dma_bytes_to_transfer = 264 *2;
			nmb_frames = r2d_lcd_dma_bytes_to_transfer / (C_LCD_IF_TX_FIFO_SIZE * sizeof (UINT16));
			r2d_lcd_dma_channel_info.source_address = (UINT32)&(tab_temp[0]);
			r2d_lcd_dma_channel_info.nmb_frames = (nmb_frames ? nmb_frames : 1);
			r2d_lcd_dma_channel_info.nmb_elements =
				((C_LCD_IF_TX_FIFO_SIZE * sizeof (UINT16)) < r2d_lcd_dma_bytes_to_transfer) 
				? (C_LCD_IF_TX_FIFO_SIZE ) : r2d_lcd_dma_bytes_to_transfer / 2;
						
			dma_set_channel_parameters (r2d_lcd_dma_channel, &r2d_lcd_dma_channel_info);
			
         /* Wait till we get event from dma callback  */
			for(;;)
			{
				received_event = rvf_wait ( EVENT_MASK(RVF_APPL_EVT_1), 0);
				if(received_event & EVENT_MASK(RVF_APPL_EVT_1))
				{
					if(r2d_lcd_dma_state == R2D_LCD_DMA_IDLE
						|| r2d_lcd_dma_state == R2D_LCD_DMA_ERROR )
					{
						break;
					}
				}
			}
		}
		else
		{
			rvf_send_trace("R2D DMA_DISABLED",strlen("R2D DMA_DISABLED"), NULL_PARAM,
				RV_TRACE_LEVEL_DEBUG_HIGH, R2D_USE_ID );
			
			f_lcd_if_poll_write(C_LCD_IF_CS0, &(tab_temp[0]), 264, C_LCD_IF_DISPLAY);
		}
#else // !USE_LCD_DMA
		
		f_lcd_if_poll_write(C_LCD_IF_CS0, &(tab_temp[0]), 264, C_LCD_IF_DISPLAY);
		
#endif // USE_LCD_DMA
		
	}
	
#endif
#endif
	
}

#ifdef R2D_USE_LCD_DMA

void r2d_dma_callback(void *response)
{
	T_DMA_STATUS_RSP_MSG *dma_status_rsp_msg = (T_DMA_STATUS_RSP_MSG *)response;

	switch(dma_status_rsp_msg->result.status)
	{
		
	case DMA_RESERVE_OK:
		r2d_lcd_dma_channel = dma_status_rsp_msg->result.channel;
		r2d_lcd_dma_state = R2D_LCD_DMA_IDLE;
		break;
		
	case DMA_PARAM_SET:
		r2d_lcd_dma_state = R2D_LCD_DMA_CHANNEL_PARAM_SET;
		f_lcd_if_dma_enable(C_LCD_IF_CS0,0,C_LCD_IF_DISPLAY);
		break;
		
	case DMA_COMPLETED:
	{
		UINT16 bytes_transfered =  ( r2d_lcd_dma_channel_info.nmb_elements
											* r2d_lcd_dma_channel_info.nmb_frames
											* 2);
		f_lcd_if_dma_disable(C_LCD_IF_CS0,f_lcd_if_dummy_callback);	
		
		if(r2d_lcd_dma_state == R2D_LCD_DMA_CHANNEL_PARAM_SET)
		{
			r2d_lcd_dma_state = R2D_LCD_DMA_IDLE;	
			r2d_lcd_dma_bytes_to_transfer -= bytes_transfered;
			
			if(r2d_lcd_dma_bytes_to_transfer > 0)
			{
				r2d_lcd_dma_channel_info.source_address = ((UINT32)&(tab_temp[0])) + bytes_transfered;				
				r2d_lcd_dma_channel_info.nmb_frames = 1;
				r2d_lcd_dma_channel_info.nmb_elements = r2d_lcd_dma_bytes_to_transfer / 2 ;
				dma_set_channel_parameters (r2d_lcd_dma_channel, &r2d_lcd_dma_channel_info);		
			}
			else
			{
				rvf_send_event( r2d_addr_id,EVENT_MASK(RVF_APPL_EVT_1));
			}
			break;
		}			
	}
	case DMA_NO_CHANNEL:
	case DMA_TOO_MANY_REQUESTS:
	case DMA_INVALID_PARAMETER:
	case DMA_NOT_READY:
	case DMA_MEMORY_ERROR:
	case DMA_ACTION_NOT_ALLOWED:
	case DMA_CHANNEL_BUSY:
	case DMA_QUEUED:
	case DMA_TIMEOUT_SOURCE:
	case DMA_TIMEOUT_DESTINATION:
	case DMA_MISS_EVENT:
	default:

		r2d_lcd_dma_ok = 0;
		r2d_lcd_dma_state = R2D_LCD_DMA_ERROR;
		rvf_send_trace("R2D DMA_ERROR",strlen("R2D DMA_ERROR"),dma_status_rsp_msg->result.status ,
			RV_TRACE_LEVEL_DEBUG_HIGH, R2D_USE_ID );			
		rvf_send_event( r2d_addr_id,EVENT_MASK(RVF_APPL_EVT_1));		
		break;
	} /* switch dma_status_rsp_msg->result.status */

	rvf_free_buf(response);
	return;
}

static E_LCD_IF_CALLBACK_RET
f_lcd_if_dummy_callback (void)
{
	/* nothing */
	return 0;
}

#endif /* USE_LCD_DMA  */

⌨️ 快捷键说明

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