Files
gk-sdk/sample/common/sample_comm_ircut.c

199 lines
6.3 KiB
C
Executable File

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "sample_comm_ircut.h"
static xmedia_s32 g_mem_dev = 0;
static xmedia_s32 sample_comm_ircut_memopen(xmedia_void)
{
if (g_mem_dev <= 0) {
g_mem_dev = open ("/dev/mem", O_CREAT | O_RDWR | O_SYNC);
if (g_mem_dev <= 0) {
return XMEDIA_FAILURE;
}
}
return XMEDIA_SUCCESS;
}
static xmedia_void sample_comm_ircut_memclose(xmedia_void)
{
if (g_mem_dev > 0) {
close(g_mem_dev);
g_mem_dev = 0;
}
}
static xmedia_void* sample_comm_ircut_memmap(xmedia_u32 phy_addr, xmedia_u32 size)
{
xmedia_u32 diff;
xmedia_u32 page_phy;
xmedia_u32 page_size;
xmedia_u8* page_addr;
page_phy = phy_addr & 0xfffff000;
diff = phy_addr - page_phy;
page_size = ((size + diff - 1) & 0xfffff000) + 0x1000;
page_addr = mmap((void *)0, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, g_mem_dev, page_phy);
if (MAP_FAILED == page_addr) {
perror("mmap error\n");
return NULL;
}
return (xmedia_void *) (page_addr + diff);
}
static xmedia_s32 sample_comm_ircut_memunmap(xmedia_void* vir_addr, xmedia_u32 size)
{
xmedia_u32 page_addr;
xmedia_u32 page_size;
xmedia_u32 diff;
page_addr = (((xmedia_u32)vir_addr) & 0xfffff000);
diff = (xmedia_u32)vir_addr - page_addr;
page_size = ((size + diff - 1) & 0xfffff000) + 0x1000;
return munmap((xmedia_void*)page_addr, page_size);
}
static xmedia_void sample_comm_ircut_set_reg(xmedia_u32 addr,xmedia_u32 value)
{
xmedia_u32 *port_vir_addr;
port_vir_addr = sample_comm_ircut_memmap(addr,sizeof(value));
*port_vir_addr = value;
sample_comm_ircut_memunmap(port_vir_addr,sizeof(value));
}
xmedia_s32 sample_comm_ircut_set_status_ir(sample_comm_board_type board_type, xmedia_s32 vi_dev)
{
xmedia_s32 ret = 0;
if (vi_dev >= VI_MAX_DEV_NUM || board_type >= BOARD_TYPE_MAX) {
return XMEDIA_FAILURE;
}
ret = sample_comm_ircut_memopen();
if (ret != XMEDIA_SUCCESS) {
return ret;
}
switch (board_type) {
case BOARD_TYPE_XM7206_V10_RB:{
//pin_mux-- GPIO4_6,GPIO4_3
sample_comm_ircut_set_reg(0x100C0024,0x05); // mutex
sample_comm_ircut_set_reg(0x100C0018,0x05); // mutex
sample_comm_ircut_set_reg(0x120B4400,0x48); // dir
sample_comm_ircut_set_reg(0x120B4120,0x40); // data
break;
}
case BOARD_TYPE_XM7206_V10B_RBA:{
//pin_mux-- GPIO3_5, GPIO3_6
sample_comm_ircut_set_reg(0x100C0000,0x00); // mutex
sample_comm_ircut_set_reg(0x100C0004,0x00); // mutex
sample_comm_ircut_set_reg(0x120B3400,0x60); // dir
sample_comm_ircut_set_reg(0x120B3180,0x20); // data
break;
}
case BOARD_TYPE_XM7206_V10B_EVB:{
//pin_mux-- GPIO5_4, GPIO5_5
sample_comm_ircut_set_reg(0x100C003C,0x00); // mutex
sample_comm_ircut_set_reg(0x100C0040,0x00); // mutex
sample_comm_ircut_set_reg(0x120B5400,0x30); // dir
sample_comm_ircut_set_reg(0x120B50C0,0x10); // data
break;
}
case BOARD_TYPE_XM7206_V11A_RBA:{
//pin_mux-- GPIO7_5, GPIO7_6
sample_comm_ircut_set_reg(0x100C0080,0x00); // mutex
sample_comm_ircut_set_reg(0x100C0084,0x00); // mutex
sample_comm_ircut_set_reg(0x120B7400,0x60); // dir
sample_comm_ircut_set_reg(0x120B7180,0x20); // data
break;
}
case BOARD_TYPE_XM7206_V11A_EVB:{
//pin_mux-- GPIO6_5, GPIO6_6
sample_comm_ircut_set_reg(0x100C0060,0x10); // mutex
sample_comm_ircut_set_reg(0x100C0064,0x10); // mutex
sample_comm_ircut_set_reg(0x120B6400,0x60); // dir
sample_comm_ircut_set_reg(0x120B6180,0x20); // data
break;
}
default:
break;
}
sample_comm_ircut_memclose();
return XMEDIA_SUCCESS;
}
xmedia_s32 sample_comm_ircut_set_status_normal(sample_comm_board_type board_type, xmedia_s32 vi_dev)
{
xmedia_s32 ret = 0;
if (vi_dev >= VI_MAX_DEV_NUM || board_type >= BOARD_TYPE_MAX) {
return XMEDIA_FAILURE;
}
ret = sample_comm_ircut_memopen();
if (ret != XMEDIA_SUCCESS) {
return ret;
}
switch (board_type) {
case BOARD_TYPE_XM7206_V10_RB:{
//pin_mux-- GPIO4_6,GPIO4_3
sample_comm_ircut_set_reg(0x100C0024,0x05); // mutex
sample_comm_ircut_set_reg(0x100C0018,0x05); // mutex
sample_comm_ircut_set_reg(0x120B4400,0x48); // dir
sample_comm_ircut_set_reg(0x120B4120,0x08); // data
break;
}
case BOARD_TYPE_XM7206_V10B_RBA:{
//pin_mux-- GPIO3_5, GPIO3_6
sample_comm_ircut_set_reg(0x100C0000,0x00); // mutex
sample_comm_ircut_set_reg(0x100C0004,0x00); // mutex
sample_comm_ircut_set_reg(0x120B3400,0x60); // dir
sample_comm_ircut_set_reg(0x120B3180,0x40); // data
break;
}
case BOARD_TYPE_XM7206_V10B_EVB:{
//pin_mux-- GPIO5_4, GPIO5_5
sample_comm_ircut_set_reg(0x100C003C,0x00); // mutex
sample_comm_ircut_set_reg(0x100C0040,0x00); // mutex
sample_comm_ircut_set_reg(0x120B5400,0x30); // dir
sample_comm_ircut_set_reg(0x120B50C0,0x20); // data
break;
}
case BOARD_TYPE_XM7206_V11A_RBA:{
//pin_mux-- GPIO7_5, GPIO7_6
sample_comm_ircut_set_reg(0x100C0080,0x00); // mutex
sample_comm_ircut_set_reg(0x100C0084,0x00); // mutex
sample_comm_ircut_set_reg(0x120B7400,0x60); // dir
sample_comm_ircut_set_reg(0x120B7180,0x40); // data
break;
}
case BOARD_TYPE_XM7206_V11A_EVB:{
//pin_mux-- GPIO6_5, GPIO6_6
sample_comm_ircut_set_reg(0x100C0060,0x10); // mutex
sample_comm_ircut_set_reg(0x100C0064,0x10); // mutex
sample_comm_ircut_set_reg(0x120B6400,0x60); // dir
sample_comm_ircut_set_reg(0x120B6180,0x40); // data
break;
}
default:
break;
}
sample_comm_ircut_memclose();
return XMEDIA_SUCCESS;
}