Files
xtensa_dsp/test/npu_test/dsp_src_test.c
2022-09-13 10:33:44 +08:00

182 lines
6.2 KiB
C

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* auto generate by HHB_VERSION "1.8.0" */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <libgen.h>
#include <unistd.h>
#include "io.h"
// #include "csi_ref.h"
#include "shm_common.h"
#include "test_bench_utils.h"
#include "../../driver/xrp-user/include/dsp_ps_ns.h"
#include "../../driver/xrp-user/dsp-ps/csi_dsp_core.h"
#include "csi_dsp_api.h"
#define MODULE_NAME "dsp_test"
#define FILE_LENGTH 1028
#define WIDTH 224
#define HEIGHT 224
int input_size[] = {1 * 3 * WIDTH * HEIGHT, };
#define BASE_MEMORY 0xD0000000
typedef struct _PictureBuffer {
unsigned int bus_address;
void *virtual_address;
unsigned int size;
} PictureBuffer;
void AllocateBuffers(PictureBuffer picbuffers[NUM_OF_BUFFERS],unsigned int buffer_num, unsigned int size, int fd_mem) {
unsigned int bus_address = BASE_MEMORY;
unsigned int buffer_size = (size + 0xFFF) & ~0xFFF;
for (int i = 0; i < buffer_num; i++) {
picbuffers[i].virtual_address = mmap(0, buffer_size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd_mem,
bus_address);
printf("mmap %p from %x with size %d\n", picbuffers[i].virtual_address, bus_address, size);
picbuffers[i].bus_address = bus_address;
picbuffers[i].size = buffer_size;
bus_address += buffer_size;
}
}
void FreeBuffers(PictureBuffer picbuffers[NUM_OF_BUFFERS], unsigned int buffer_num, unsigned int size, int fd_mem) {
for (int i = 0; i < buffer_num; i++) {
munmap(picbuffers[i].virtual_address, picbuffers[i].size);
}
}
int main(int argc, char **argv) {
char **data_path = NULL;
int input_num = 1;
int output_num = 1;
int i;
int index = 0;
if (argc < (1 + input_num)) {
printf("Please set valide args: ./dsp_src_test image.rgb\n");
return -1;
} else {
data_path = argv + 1;
}
struct csi_dsp_instance *instance = csi_dsp_create_instance(0);
if(!instance)
{
printf("create fail\n");
return -1;
}
struct data_move_msg cmd;
int fd = shm_open("/ispnpu", O_RDWR, 0);
if (fd == -1) {
printf("%s: failed to shm_open", MODULE_NAME);
return -1;
}
ShmBuffer *buffer = mmap(NULL, sizeof(ShmBuffer),
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (buffer == MAP_FAILED) {
printf("%s: failed to mmap", MODULE_NAME);
return -1;
}
int fd_mem = open("/dev/mem", O_RDWR | O_SYNC);
if (fd_mem < 0) {
printf("%s: failed to open /dev/mem", MODULE_NAME);
return -1;
}
int in_size = input_size[0];
char filename[FILE_LENGTH] = {0};
char filename_prefix[FILE_LENGTH] = {0};
uint64_t start_time, end_time;
PictureBuffer picbuffers[NUM_OF_BUFFERS*2];
AllocateBuffers(picbuffers, NUM_OF_BUFFERS*2,in_size, fd_mem);
do {
if (buffer->exit == 0) {
// Wait for available slot in buffer queue
printf("sem_wait before\n");
if (sem_wait(&buffer->sem_sink) == -1) {
printf("%s: failed to open sem_wait", MODULE_NAME);
return -1;
}
printf("sem_wait end\n");
//ProcessOneFrame(picbuffers[index].virtual_address, fp, size);
fill_buffer_from_file(data_path[0], picbuffers[index].virtual_address);
printf("%s: prepared frame %d 0x%08x: %dx%d\n",
MODULE_NAME, index, picbuffers[index].bus_address,
WIDTH, HEIGHT);
cmd.src_addr= picbuffers[index].bus_address;
cmd.dst_addr= picbuffers[NUM_OF_BUFFERS+index].bus_address;
cmd.size = picbuffers[index].size;
printf("%s: data move cmd frame %d from 0x%lx to 0x%lx ,size:%d\n",
MODULE_NAME, index, cmd.src_addr, cmd.dst_addr,cmd.size);
//snprintf(filename, FILE_LENGTH, "%s_src_data%u.txt", filename_prefix, i);
//save_uint8_to_file(filename, (uint8_t*)picbuffers[index].virtual_address, in_size);
if(csi_dsp_cmd_send(instance->comm_queue,PS_CMD_DATA_MOVE,&cmd,sizeof(struct data_move_msg),NULL,0,NULL))
{
printf("%s:cmd_to_dsp fail\n",MODULE_NAME);
return -1;
}
PictureInfo *pic = &buffer->pics[index];
pic->bus_address_rgb = picbuffers[NUM_OF_BUFFERS+index].bus_address;
pic->pic_width = WIDTH;
pic->pic_height = HEIGHT;
printf("%s: Processed frame %d 0x%08x: %dx%d\n",
MODULE_NAME, index, pic->bus_address_rgb,
pic->pic_width, pic->pic_height);
// Notify npu one picture is ready for inference
if (sem_post(&buffer->sem_src) == -1) {
printf("%s: failed to sem_post\n", MODULE_NAME);
return -1;
}
}
else {
// If encoder set the 'exit' flag to 1, finish process
printf("%s: Exit at loop %d\n", MODULE_NAME, index);
// Notify encoder all the resource has been released
if (sem_post(&buffer->sem_src) == -1) {
printf("%s: failed to sem_post\n", MODULE_NAME);
return -1;
}
}
index = (index + 1) % NUM_OF_BUFFERS;
} while (buffer->exit == 0);
cleanup:
FreeBuffers(picbuffers, NUM_OF_BUFFERS*2,in_size, fd_mem);
munmap(buffer, sizeof(ShmBuffer));
shm_unlink("/ispnpu");
return 0;
}