Debug PLIC

fix_cache
xiangbingj 2019-10-18 11:40:00 +08:00
parent a263ae5661
commit 9e5ee183af
5 changed files with 83 additions and 35 deletions

View File

@ -116,11 +116,13 @@ public:
virtual void on_first_open() override
{
sysctl_clock_enable(clock_);
dma_ch_ = dma_open_free();
}
virtual void on_last_close() override
{
sysctl_clock_disable(clock_);
dma_close(dma_ch_);
}
virtual handle_t model_load_from_buffer(uint8_t *buffer) override
@ -134,7 +136,7 @@ public:
auto model_context = system_handle_to_object(context).as<k_model_context>();
model_context->get(&ctx_);
dma_ch_ = dma_open_free();
ctx_.current_layer = 0;
ctx_.current_body = ctx_.body_start;
@ -147,7 +149,7 @@ public:
kpu_.interrupt_mask.reg = 0b110;
pic_set_irq_priority(IRQN_AI_INTERRUPT, 1);
pic_set_irq_priority(IRQN_AI_INTERRUPT, 2);
pic_set_irq_handler(IRQN_AI_INTERRUPT, kpu_isr_handle, this);
pic_set_irq_enable(IRQN_AI_INTERRUPT, 1);
@ -186,7 +188,7 @@ public:
}
}
done_flag_ = 0;
dma_close(dma_ch_);
return 0;
}
@ -342,6 +344,7 @@ private:
void kpu_input_dma(const kpu_layer_argument_t *layer, const uint8_t *src)
{
configASSERT(!is_memory_cache((uintptr_t)src));
uint64_t input_size = layer->kernel_calc_type_cfg.data.channel_switch_addr * 64 * (layer->image_channel_num.data.i_ch_num + 1);
dma_set_request_source(dma_ch_, dma_req_);
@ -805,7 +808,7 @@ private:
kpu_.interrupt_mask.reg = 0b111;
layer.dma_parameter.data.send_data_out = 1;
dma_set_request_source(dma_ch_, dma_req_);
dma_transmit_async(dma_ch_, (void *)(&kpu_.fifo_data_out), dest-0x40000000, 0, 1, sizeof(uint64_t), (layer.dma_parameter.data.dma_total_byte + 8) / 8, 8, completion_event_);
dma_transmit_async(dma_ch_, (void *)(&kpu_.fifo_data_out), (void *)dest, 0, 1, sizeof(uint64_t), (layer.dma_parameter.data.dma_total_byte + 8) / 8, 8, completion_event_);
}
else
{

View File

@ -21,7 +21,7 @@
using namespace sys;
static volatile plic_t &plic = *reinterpret_cast<volatile plic_t *>(PLIC_BASE_ADDR);
volatile plic_t &plic = *reinterpret_cast<volatile plic_t *>(PLIC_BASE_ADDR);
class k_plic_driver : public pic_driver, public static_object, public free_object_access
{

View File

@ -27,6 +27,7 @@
#include <sysctl.h>
#include <utility.h>
#include <printf.h>
#include <plic.h>
using namespace sys;
@ -35,6 +36,7 @@ using namespace sys;
/* SPI Controller */
extern volatile plic_t plic;
#define TMOD_MASK (3 << tmod_off_)
#define TMOD_VALUE(value) (value << tmod_off_)
#define COMMON_ENTRY \
@ -711,9 +713,15 @@ int k_spi_driver::read(k_spi_device_driver &device, gsl::span<uint8_t> buffer)
write_inst_addr(spi_.dr, &buffer_it, device.addr_width_);
spi_.ser = device.chip_select_mask_;
uint32_t spi_mstatus_t = 0;
if(pdFALSE == xSemaphoreTake(event_read, SPI_DMA_BLOCK_TIME))
{
printk("read:context.flag = %d \n", context_.flag);
asm("csrr %0, mstatus"
: "=r"(spi_mstatus_t)
:
: "cc");
printk("read:context.flag = %d plic.pending_bits.u32[0]=0x%x plic.pending_bits.u32[1]=0x%x\n", context_.flag,plic.pending_bits.u32[0],plic.pending_bits.u32[1]);
printk("read:spi_mstatus_t = 0x%x claim_complete=%d \n", spi_mstatus_t, plic.targets.target[0].claim_complete);
}
context_.flag = 0;
dma_test_async(dma_read, &context_);
@ -789,7 +797,13 @@ int k_spi_driver::write(k_spi_device_driver &device, gsl::span<const uint8_t> bu
spi_.ser = device.chip_select_mask_;
if(pdFALSE == xSemaphoreTake(event_write, SPI_DMA_BLOCK_TIME))
{
printk("write:context.flag = %d \n", context_.flag);
uint32_t spi_mstatus_t = 0;
asm("csrr %0, mstatus"
: "=r"(spi_mstatus_t)
:
: "cc");
printk("write:context.flag = %d plic.pending_bits.u32[0]=0x%x plic.pending_bits.u32[1]=0x%x\n", context_.flag,plic.pending_bits.u32[0],plic.pending_bits.u32[1]);
printk("write:spi_mstatus_t=0x%x claim_complete=%d \n", spi_mstatus_t, plic.targets.target[0].claim_complete);
}
context_.flag = 0;
dma_test_async(dma_write, &context_);

View File

@ -93,7 +93,7 @@ enum
/* memory */
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 1024 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 2*1024 * 1024 ) )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1024 * 1024 ) )
#define configSUPPORT_STATIC_ALLOCATION 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1

View File

@ -116,8 +116,10 @@ static void draw_edge(uint32_t *gram, obj_info_t *obj_info, uint32_t index, uint
}
}
#define TEST_START_ADDR (0x300000U)
#define TEST_NUMBER (0x100U)
#define TEST_START_ADDR (0xB00000U)
#define TEST_START_ADDR2 (0x100000U)
#define TEST_NUMBER (0x1000U)
uint8_t data_buf_send[TEST_NUMBER];
uint8_t *data_buf_recv;
handle_t spi3;
@ -145,24 +147,42 @@ void vTask1()
{
int32_t index = 0;
int32_t page_addr = TEST_START_ADDR;
for (index = 0; index < TEST_NUMBER; index++)
data_buf_send[index] = (uint8_t)(index);
struct timeval get_time[2];
while (1)
{
task1_flag = 1;
//configASSERT(xSemaphoreTake(event_read, 200) == pdTRUE);
_lock_acquire_recursive(&flash_lock);
gettimeofday(&get_time[0], NULL);
#if 0
fseek(stream,0,SEEK_SET);
fwrite(msg, 1, strlen(msg)+1, stream);
#else
if(page_addr >= 0x1000000 - TEST_NUMBER)
{
page_addr = TEST_START_ADDR;
}
task1_flag = 2;
w25qxx_write_data(page_addr, data_buf_send, TEST_NUMBER);
w25qxx_read_data(page_addr, data_buf_recv, TEST_NUMBER);
for (index = 0; index < TEST_NUMBER; index++)
{
if (data_buf_recv[index] != (uint8_t)index) {
printk("task1 Read err:0x%x 0x%x\n", data_buf_recv[index], index);
index += 0x100;
}
}
page_addr += TEST_NUMBER;
task1_flag = 3;
#endif
gettimeofday(&get_time[1], NULL);;
//printf("vtask1:%f ms \n", ((get_time[1].tv_sec - get_time[0].tv_sec)*1000*1000 + (get_time[1].tv_usec - get_time[0].tv_usec))/1000.0);
//xSemaphoreGive(event_read);
_lock_release_recursive(&flash_lock);
task1_flag = 4;
vTaskDelay(50 / portTICK_PERIOD_MS);
}
@ -171,40 +191,44 @@ void vTask1()
void vTask2()
{
int32_t index = 0;
int32_t page_addr = TEST_START_ADDR;
data_buf_recv = iomem_malloc(TEST_NUMBER);
while (1)
int32_t page_addr = TEST_START_ADDR2;
struct timeval get_time[2];
while (1)
{
task2_flag = 1;
//configASSERT(xSemaphoreTake(event_read, 200) == pdTRUE);
_lock_acquire_recursive(&flash_lock);
for (index = 0; index < TEST_NUMBER; index++)
data_buf_recv[index] = 0;
gettimeofday(&get_time[0], NULL);
#if 0
fseek(stream,0,SEEK_SET);
fread(buffer, 1, strlen(msg)+1, stream);
printk("test syscalls buffer : %s\n", buffer);
xSemaphoreGive(event_read);
fwrite(msg, 1, strlen(msg)+1, stream);
#else
if(page_addr >= 0xA00000 - TEST_NUMBER)
{
page_addr = TEST_START_ADDR2;
}
task2_flag = 2;
w25qxx_read_data(page_addr, data_buf_recv, TEST_NUMBER);
task2_flag = 3;
w25qxx_write_data(page_addr, data_buf_send, TEST_NUMBER);
w25qxx_read_data(page_addr, data_buf_recv, TEST_NUMBER);
//xSemaphoreGive(event_read);
_lock_release_recursive(&flash_lock);
for (index = 0; index < TEST_NUMBER; index++)
{
if (data_buf_recv[index] != (uint8_t)index) {
printf("Read err\n");
while(1)
;
printk("task2 Read err:0x%x 0x%x\n", data_buf_recv[index], index);
index += 0x100;
}
}
//printf("%X Test OK\n", page_addr);
task2_flag = 4;
page_addr += TEST_NUMBER;
task2_flag = 3;
#endif
gettimeofday(&get_time[1], NULL);;
//printf("vtask2:%f ms \n", ((get_time[1].tv_sec - get_time[0].tv_sec)*1000*1000 + (get_time[1].tv_usec - get_time[0].tv_usec))/1000.0);
//xSemaphoreGive(event_read);
_lock_release_recursive(&flash_lock);
task2_flag = 4;
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
@ -234,10 +258,12 @@ void detect()
face_detect_rl.input = output;
region_layer_run(&face_detect_rl, &face_detect_info);
for (uint32_t face_cnt = 0; face_cnt < face_detect_info.obj_number; face_cnt++) {
draw_edge(lcd_gram, &face_detect_info, face_cnt, RED);
}
//for (uint32_t face_cnt = 0; face_cnt < face_detect_info.obj_number; face_cnt++) {
// draw_edge(lcd_gram, &face_detect_info, face_cnt, RED);
//}
#endif
if(face_detect_info.obj_number)
printk("=====>face detect %d \n", face_detect_info.obj_number);
if(!task1_flag)
printk("==========>%d %d \n", task1_flag, task2_flag);
if(!task2_flag)
@ -281,6 +307,11 @@ int main(void)
struct timeval get_time[2];
gettimeofday(&get_time[0], NULL);
//event_read = xSemaphoreCreateMutex();
data_buf_recv = iomem_malloc(TEST_NUMBER);
for (uint32_t index = 0; index < TEST_NUMBER; index++)
{
data_buf_send[index] = (uint8_t)(index);
}
#if LOAD_KMODEL_FROM_FLASH
model_data = (uint8_t *)iomem_malloc(KMODEL_SIZE);
#endif