?? r2d_task_i_epson.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 + -