1.增加mem存图代码

This commit is contained in:
payton 2023-11-16 09:44:26 +08:00
parent b8b50270f1
commit 878b5bc8a2
4 changed files with 610 additions and 0 deletions

View File

@ -0,0 +1,264 @@
#include "sys_usrmem.h"
#include "rtosfdt.h"
#include "libfdt.h"
#include "compiler.h"
#include <kwrap/error_no.h>
#include <kwrap/debug.h>
#include "MemCheck.h"
#include "hdal.h"
#if !defined(__FREERTOS)
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#endif
#if defined(__FREERTOS)
INT32 sys_usrmem_init(SYS_USRMEM* usrmem)
{
const void* fdt = fdt_get_base();
int nodeoffset = fdt_path_offset((const void*)fdt, SYS_USRMEM_NODE);
int len;
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
usrmem->is_init = FALSE;
if(nodeoffset >= 0){
const unsigned long *nodep;
nodep = (const unsigned long *)fdt_getprop(fdt, nodeoffset, "reg", &len);
usrmem->used_size = 0;
usrmem->addr = be32_to_cpu(nodep[0]);
usrmem->size = be32_to_cpu(nodep[1]);
usrmem->hdr = (SYS_USRMEM_HDR*) usrmem->addr;
usrmem->hdr->photo_ofs = 0;
usrmem->hdr->photo_size = 0;
usrmem->hdr->photo_sum = 0;
usrmem->hdr->tag = SYS_USRMEM_TAG;
usrmem->used_size += sizeof(SYS_USRMEM_HDR);
usrmem->addr_photo = usrmem->addr + usrmem->used_size;
DBG_DUMP("usrmem addr = %lx, size = %lx, addr_hdr = %lx, addr_photo = %lx\n",
usrmem->addr,
usrmem->size,
usrmem->hdr ,
usrmem->addr_photo);
usrmem->is_init = TRUE;
return E_OK;
}
DBG_ERR("fdt node %s not found!\n", SYS_USRMEM_NODE);
return E_SYS;
}
INT32 sys_usrmem_write_photo(SYS_USRMEM* usrmem, UINT32 buf, UINT32 size)
{
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
if(usrmem->addr_photo == 0){
DBG_ERR("address photo can't be null!\n");
return E_SYS;
}
if(buf == 0){
DBG_ERR("buf can't be null!\n");
return E_SYS;
}
if(size == 0){
DBG_ERR("size can't be zero!\n");
return E_SYS;
}
if(usrmem->is_init == FALSE){
DBG_ERR("usrmem is not init yet!\n");
return E_SYS;
}
memcpy((void*)usrmem->addr_photo, (void*)buf, size);
usrmem->hdr->photo_ofs = usrmem->used_size;
usrmem->hdr->photo_size = size;
usrmem->hdr->photo_sum = MemCheck_CalcCheckSum16Bit(usrmem->addr_photo, size);
usrmem->used_size += size;
hd_common_mem_flush_cache((void*)usrmem->addr, usrmem->used_size);
DBG_DUMP("photo addr:%lx, size:%lx, sum:%lx\n", usrmem->addr_photo, usrmem->hdr->photo_size, usrmem->hdr->photo_sum);
return E_OK;
}
#else
static void* usrmem_mmap(int fd, unsigned int mapped_size, off_t phy_addr)
{
void *map_base = NULL;
unsigned page_size = 0;
page_size = getpagesize();
map_base = mmap(NULL,
mapped_size,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
(phy_addr) & ~(off_t)(page_size - 1));
if (map_base == MAP_FAILED)
return NULL;
return map_base;
}
static int usrmem_munmap(void* map_base, unsigned int mapped_size)
{
if (munmap(map_base, mapped_size) == -1)
return -1;
return 0;
}
static int usrmem_init_dev(char* dev)
{
int fd = 0;
DBG_DUMP("open %s\n", dev);
fd = open(dev, O_RDWR | O_SYNC);
return fd;
}
INT32 sys_usrmem_init(SYS_USRMEM* usrmem)
{
const void* fdt = fdt_get_base();
int nodeoffset = fdt_path_offset((const void*)fdt, SYS_USRMEM_NODE);
int len;
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
usrmem->is_init = FALSE;
if(nodeoffset >= 0){
const unsigned long *nodep;
nodep = (const unsigned long *)fdt_getprop(fdt, nodeoffset, "reg", &len);
usrmem->addr = be32_to_cpu(nodep[0]);
usrmem->size = be32_to_cpu(nodep[1]);
int fd = usrmem_init_dev("/dev/mem");
if(fd < 0){
DBG_ERR("open %s failed\n", "/dev/mem");
return E_SYS;
}
DBG_DUMP("usrmem addr:%lx size:%lx\n", usrmem->addr, usrmem->size);
void* va = usrmem_mmap(fd, usrmem->size ,usrmem->addr);
if(va){
usrmem->hdr = va;
usrmem->used_size = sizeof(SYS_USRMEM_HDR);
if(usrmem->hdr->tag == SYS_USRMEM_TAG){
DBG_DUMP("check tag ok, hdr ofs:%lx, size:%lx, sum:%lx\n",
usrmem->hdr->photo_ofs,
usrmem->hdr->photo_size,
usrmem->hdr->photo_sum);
usrmem->addr_photo = (UINT32)va + usrmem->hdr->photo_ofs;
DBG_DUMP("photo data = %lx\n", *((UINT32*)usrmem->addr_photo));
UINT32 sum = MemCheck_CalcCheckSum16Bit(usrmem->addr_photo, usrmem->hdr->photo_size);
usrmem->used_size += usrmem->hdr->photo_size;
if(sum == usrmem->hdr->photo_sum){
DBG_DUMP("checksum ok(%lx)\n", sum);
usrmem->is_init = TRUE;
return E_OK;
}
else{
DBG_ERR("checksum err(%lx)\n", sum);
}
}
else{
DBG_WRN("invalid usrmem hdr tag(%lx)!\n", usrmem->hdr->tag);
}
}
else{
DBG_ERR("mmap failed(addr:%lx size:%lx)\n", usrmem->addr, usrmem->size);
}
close(fd);
}
return E_SYS;
}
INT32 sys_usrmem_read_photo(SYS_USRMEM* usrmem, UINT32* addr, UINT32* size)
{
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
if(usrmem->is_init == FALSE){
DBG_ERR("usrmem not init yet!\n");
return E_SYS;
}
if(addr == NULL || size == NULL){
DBG_ERR("addr & size can't be null!\n");
return E_SYS;
}
*addr = usrmem->addr_photo;
*size = usrmem->hdr->photo_size;
return E_OK;
}
INT32 sys_usrmem_hdr_uninit(SYS_USRMEM* usrmem)
{
if(usrmem == NULL ){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
if(!usrmem->addr && !usrmem->size){
DBG_ERR("addr & size can't be zero!\n");
return E_SYS;
}
return usrmem_munmap((void* )usrmem->addr, usrmem->size);;
}
#endif

View File

@ -0,0 +1,41 @@
#ifndef SYS_USRMEM_H
#define SYS_USRMEM_H
#include "kwrap/type.h"
#define SYS_USRMEM_NODE "/nvt_memory_cfg/usrmem"
#define SYS_USRMEM_TAG MAKEFOURCC('U','S','R','M')
typedef struct{
UINT32 tag;
UINT32 photo_ofs;
UINT32 photo_size;
UINT32 photo_sum;
} SYS_USRMEM_HDR;
typedef struct{
UINT32 addr;
UINT32 size;
UINT32 used_size;
SYS_USRMEM_HDR* hdr;
UINT32 addr_photo;
BOOL is_init;
} SYS_USRMEM;
INT32 sys_usrmem_init(SYS_USRMEM* usrmem);
#if defined(__FREERTOS)
INT32 sys_usrmem_write_photo(SYS_USRMEM* usrmem, UINT32 buf, UINT32 size);
#else
INT32 sys_usrmem_read_photo(SYS_USRMEM* usrmem, UINT32* addr, UINT32* size);
#endif
#endif

View File

@ -0,0 +1,41 @@
#ifndef SYS_USRMEM_H
#define SYS_USRMEM_H
#include "kwrap/type.h"
#define SYS_USRMEM_NODE "/nvt_memory_cfg/usrmem"
#define SYS_USRMEM_TAG MAKEFOURCC('U','S','R','M')
typedef struct{
UINT32 tag;
UINT32 photo_ofs;
UINT32 photo_size;
UINT32 photo_sum;
} SYS_USRMEM_HDR;
typedef struct{
UINT32 addr;
UINT32 size;
UINT32 used_size;
SYS_USRMEM_HDR* hdr;
UINT32 addr_photo;
BOOL is_init;
} SYS_USRMEM;
INT32 sys_usrmem_init(SYS_USRMEM* usrmem);
#if defined(__FREERTOS)
INT32 sys_usrmem_write_photo(SYS_USRMEM* usrmem, UINT32 buf, UINT32 size);
#else
INT32 sys_usrmem_read_photo(SYS_USRMEM* usrmem, UINT32* addr, UINT32* size);
#endif
#endif

View File

@ -0,0 +1,264 @@
#include "sys_usrmem.h"
#include "rtosfdt.h"
#include "libfdt.h"
#include "compiler.h"
#include <kwrap/error_no.h>
#include <kwrap/debug.h>
#include "MemCheck.h"
#include "hdal.h"
#if !defined(__FREERTOS)
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#endif
#if defined(__FREERTOS)
INT32 sys_usrmem_init(SYS_USRMEM* usrmem)
{
const void* fdt = fdt_get_base();
int nodeoffset = fdt_path_offset((const void*)fdt, SYS_USRMEM_NODE);
int len;
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
usrmem->is_init = FALSE;
if(nodeoffset >= 0){
const unsigned long *nodep;
nodep = (const unsigned long *)fdt_getprop(fdt, nodeoffset, "reg", &len);
usrmem->used_size = 0;
usrmem->addr = be32_to_cpu(nodep[0]);
usrmem->size = be32_to_cpu(nodep[1]);
usrmem->hdr = (SYS_USRMEM_HDR*) usrmem->addr;
usrmem->hdr->photo_ofs = 0;
usrmem->hdr->photo_size = 0;
usrmem->hdr->photo_sum = 0;
usrmem->hdr->tag = SYS_USRMEM_TAG;
usrmem->used_size += sizeof(SYS_USRMEM_HDR);
usrmem->addr_photo = usrmem->addr + usrmem->used_size;
DBG_DUMP("usrmem addr = %lx, size = %lx, addr_hdr = %lx, addr_photo = %lx\n",
usrmem->addr,
usrmem->size,
usrmem->hdr ,
usrmem->addr_photo);
usrmem->is_init = TRUE;
return E_OK;
}
DBG_ERR("fdt node %s not found!\n", SYS_USRMEM_NODE);
return E_SYS;
}
INT32 sys_usrmem_write_photo(SYS_USRMEM* usrmem, UINT32 buf, UINT32 size)
{
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
if(usrmem->addr_photo == 0){
DBG_ERR("address photo can't be null!\n");
return E_SYS;
}
if(buf == 0){
DBG_ERR("buf can't be null!\n");
return E_SYS;
}
if(size == 0){
DBG_ERR("size can't be zero!\n");
return E_SYS;
}
if(usrmem->is_init == FALSE){
DBG_ERR("usrmem is not init yet!\n");
return E_SYS;
}
memcpy((void*)usrmem->addr_photo, (void*)buf, size);
usrmem->hdr->photo_ofs = usrmem->used_size;
usrmem->hdr->photo_size = size;
usrmem->hdr->photo_sum = MemCheck_CalcCheckSum16Bit(usrmem->addr_photo, size);
usrmem->used_size += size;
hd_common_mem_flush_cache((void*)usrmem->addr, usrmem->used_size);
DBG_DUMP("photo addr:%lx, size:%lx, sum:%lx\n", usrmem->addr_photo, usrmem->hdr->photo_size, usrmem->hdr->photo_sum);
return E_OK;
}
#else
static void* usrmem_mmap(int fd, unsigned int mapped_size, off_t phy_addr)
{
void *map_base = NULL;
unsigned page_size = 0;
page_size = getpagesize();
map_base = mmap(NULL,
mapped_size,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
(phy_addr) & ~(off_t)(page_size - 1));
if (map_base == MAP_FAILED)
return NULL;
return map_base;
}
static int usrmem_munmap(void* map_base, unsigned int mapped_size)
{
if (munmap(map_base, mapped_size) == -1)
return -1;
return 0;
}
static int usrmem_init_dev(char* dev)
{
int fd = 0;
DBG_DUMP("open %s\n", dev);
fd = open(dev, O_RDWR | O_SYNC);
return fd;
}
INT32 sys_usrmem_init(SYS_USRMEM* usrmem)
{
const void* fdt = fdt_get_base();
int nodeoffset = fdt_path_offset((const void*)fdt, SYS_USRMEM_NODE);
int len;
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
usrmem->is_init = FALSE;
if(nodeoffset >= 0){
const unsigned long *nodep;
nodep = (const unsigned long *)fdt_getprop(fdt, nodeoffset, "reg", &len);
usrmem->addr = be32_to_cpu(nodep[0]);
usrmem->size = be32_to_cpu(nodep[1]);
int fd = usrmem_init_dev("/dev/mem");
if(fd < 0){
DBG_ERR("open %s failed\n", "/dev/mem");
return E_SYS;
}
DBG_DUMP("usrmem addr:%lx size:%lx\n", usrmem->addr, usrmem->size);
void* va = usrmem_mmap(fd, usrmem->size ,usrmem->addr);
if(va){
usrmem->hdr = va;
usrmem->used_size = sizeof(SYS_USRMEM_HDR);
if(usrmem->hdr->tag == SYS_USRMEM_TAG){
DBG_DUMP("check tag ok, hdr ofs:%lx, size:%lx, sum:%lx\n",
usrmem->hdr->photo_ofs,
usrmem->hdr->photo_size,
usrmem->hdr->photo_sum);
usrmem->addr_photo = (UINT32)va + usrmem->hdr->photo_ofs;
DBG_DUMP("photo data = %lx\n", *((UINT32*)usrmem->addr_photo));
UINT32 sum = MemCheck_CalcCheckSum16Bit(usrmem->addr_photo, usrmem->hdr->photo_size);
usrmem->used_size += usrmem->hdr->photo_size;
if(sum == usrmem->hdr->photo_sum){
DBG_DUMP("checksum ok(%lx)\n", sum);
usrmem->is_init = TRUE;
return E_OK;
}
else{
DBG_ERR("checksum err(%lx)\n", sum);
}
}
else{
DBG_WRN("invalid usrmem hdr tag(%lx)!\n", usrmem->hdr->tag);
}
}
else{
DBG_ERR("mmap failed(addr:%lx size:%lx)\n", usrmem->addr, usrmem->size);
}
close(fd);
}
return E_SYS;
}
INT32 sys_usrmem_read_photo(SYS_USRMEM* usrmem, UINT32* addr, UINT32* size)
{
if(usrmem == NULL){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
if(usrmem->is_init == FALSE){
DBG_ERR("usrmem not init yet!\n");
return E_SYS;
}
if(addr == NULL || size == NULL){
DBG_ERR("addr & size can't be null!\n");
return E_SYS;
}
*addr = usrmem->addr_photo;
*size = usrmem->hdr->photo_size;
return E_OK;
}
INT32 sys_usrmem_hdr_uninit(SYS_USRMEM* usrmem)
{
if(usrmem == NULL ){
DBG_ERR("usrmem can't be null!\n");
return E_SYS;
}
if(!usrmem->addr && !usrmem->size){
DBG_ERR("addr & size can't be zero!\n");
return E_SYS;
}
return usrmem_munmap((void* )usrmem->addr, usrmem->size);;
}
#endif