static void fix_sizes(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { reserve_mdp_size = MSM7x25A_MSM_RESERVE_MDP_SIZE; reserve_adsp_size = MSM7x25A_MSM_RESERVE_ADSP_SIZE; } else { reserve_mdp_size = MSM_RESERVE_MDP_SIZE; reserve_adsp_size = MSM_RESERVE_ADSP_SIZE; } if (get_ddr_size() > SZ_512M) reserve_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_audio_size = MSM_RESERVE_AUDIO_SIZE; msm_ion_sf_size = reserve_mdp_size; #ifdef CONFIG_CMA if (get_ddr_size() > SZ_256M) reserve_adsp_size = CAMERA_ZSL_SIZE; msm_ion_camera_size = reserve_adsp_size; msm_ion_camera_size_carving = 0; #else msm_ion_camera_size = reserve_adsp_size; msm_ion_camera_size_carving = msm_ion_camera_size; #endif #endif }
void load_frame(char* filepath) { if (access(filepath, F_OK) == -1) { printf("%s not found!", filepath); exit(1); } FILE* fp = fopen(filepath, "rb"); // get the size fseek(fp, 0, SEEK_END); long fsize = ftell(fp); fseek(fp, 0, SEEK_SET); // validate size if (get_ddr_size() < fsize) { int ddrSize = get_ddr_size(); printf("The size of shared memory is too small! Need %d bytes but only have %d.\n", (int)fsize, ddrSize); if (ddrSize < 8 * 1024 * 1024) printf("Shared memory is smaller than the maximum of 8 megabytes. Has the hardware been initialized?\n"); exit(1); } // read the file uint32_t* fileData = (uint32_t*)malloc(fsize); fread(fileData, fsize, 1, fp); fclose(fp); if (fsize % BYTE_SIZE_SLICE != 0) { printf("LED data needs to be divisible by the size of a slice (%d bytes).\n", BYTE_SIZE_SLICE); exit(1); } sliceCount = fsize / BYTE_SIZE_SLICE; // copy the data into shared memory for (int slice = 0; slice < sliceCount; slice++) { for (int row = 0; row < NUM_ROWS; row++) { int index = 4 * 32 * (NUM_ROWS * slice + row); reorientBits(fileData + index); } } memcpy(ddrMem, fileData, fsize); free(fileData); }
static void fix_sizes(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { pmem_mdp_size = MSM7x25A_MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM7x25A_MSM_PMEM_ADSP_SIZE; } else { pmem_mdp_size = MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM_PMEM_ADSP_SIZE; } if (get_ddr_size() > SZ_512M) pmem_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_audio_size = MSM_PMEM_AUDIO_SIZE; msm_ion_sf_size = pmem_mdp_size; #ifdef CONFIG_CMA msm_ion_camera_size = CAMERA_ZSL_SIZE; msm_ion_camera_size_carving = 0; #else msm_ion_camera_size = pmem_adsp_size; msm_ion_camera_size_carving = msm_ion_camera_size; #endif #endif }
static void fix_sizes(void) { if (get_ddr_size() > SZ_512M) pmem_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_camera_size = pmem_adsp_size; msm_ion_audio_size = (MSM_PMEM_AUDIO_SIZE + PMEM_KERNEL_EBI1_SIZE); msm_ion_sf_size = pmem_mdp_size; #endif }
static void fix_sizes(void) { if (get_ddr_size() > SZ_512M) reserve_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_camera_size = reserve_adsp_size; msm_ion_audio_size = (MSM_RESERVE_AUDIO_SIZE + RESERVE_KERNEL_EBI1_SIZE); msm_ion_sf_size = reserve_mdp_size; #endif }
void init_memory() { // open memory device mem_fd = open("/dev/mem", O_RDWR | O_SYNC); if (mem_fd < 0) { printf("Failed to open /dev/mem (%s)\n", strerror(errno)); exit(1); } // map the shared DDR memory uint32_t size = get_ddr_size(); uint32_t* address = get_ddr_address(); ddrMem = (uint32_t*)mmap(0, size, PROT_WRITE | PROT_READ, MAP_SHARED, mem_fd, (int)address); if (ddrMem == NULL) { printf("Failed to map the device (%s)\n", strerror(errno)); close(mem_fd); exit(1); } }
static void fix_sizes(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { pmem_mdp_size = MSM7x25A_MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM7x25A_MSM_PMEM_ADSP_SIZE; } else { pmem_mdp_size = MSM_PMEM_MDP_SIZE; pmem_adsp_size = get_pmem_adsp_size(); printk("pmem_adsp_size=%08x\n",pmem_adsp_size); } if (get_ddr_size() > SZ_512M) pmem_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_camera_size = pmem_adsp_size; msm_ion_audio_size = (MSM_PMEM_AUDIO_SIZE + PMEM_KERNEL_EBI1_SIZE); msm_ion_sf_size = pmem_mdp_size; #endif }
static void fix_sizes(void) { if (get_ddr_size() > SZ_512M) pmem_adsp_size = CAMERA_ZSL_SIZE; else { if (machine_is_msm8625q_skue() || machine_is_msm8625q_evbd() || machine_is_msm8625q_skud()) pmem_mdp_size = 0; } #ifdef CONFIG_ION_MSM msm_ion_audio_size = MSM_PMEM_AUDIO_SIZE; #ifdef CONFIG_CMA msm_ion_camera_size = CAMERA_ZSL_SIZE; msm_ion_camera_size_carving = 0; #else msm_ion_camera_size = pmem_adsp_size; msm_ion_camera_size_carving = msm_ion_camera_size; #endif msm_ion_sf_size = pmem_mdp_size; #endif }
void print_led_info(char* filepath) { if (access(filepath, F_OK) == -1) { printf("file %s does not exist.", filepath); exit(1); } FILE* fp = fopen(filepath, "rb"); // get the size fseek(fp, 0, SEEK_END); long fsize = ftell(fp); fseek(fp, 0, SEEK_SET); // validate size if (fsize % BYTE_SIZE_SLICE != 0) { printf("Problem:\tData length is not a multiple of the slice size (%d bytes).\n", BYTE_SIZE_SLICE); exit(1); } else { printf("Info:\tContains %d slices.\n", (int)fsize / BYTE_SIZE_SLICE); } if (get_ddr_size() < fsize) { printf("Warning: The current size of shared memory is too small! Need %d bytes for this frame but only have %d.\n", (int)fsize, get_ddr_size()); exit(1); } // read file into shared memory uint32_t* frame = (uint32_t*)malloc(fsize); fread(frame, fsize, 1, fp); fclose(fp); validate_frame(frame, fsize / 4); }
int main(int argc, char* argv[]) { // parse cli arguments char* filepath; if (argc == 2) { filepath = argv[1]; } else { printf("usage: %s some-led-data.dat\n", argv[0]); exit(1); } prussdrv_init(); int ret = prussdrv_open(PRU_EVTOUT_0); if (ret) { printf("prussdrv_open open failed\n"); exit(1); } tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA; prussdrv_pruintc_init(&pruss_intc_initdata); // initialize memory shared between PRU and host application init_memory(); // initialize interface to PRU pru_ctrl_init(mem_fd); // put the LED data in the file where the PRU can get it load_frame(filepath); // tell the PRU where to find the data pru_write_reg(REG_ADDRESS, (uint32_t)get_ddr_address()); // tell the PRU how many slices we have pru_write_reg(REG_SLICE_TOTAL, sliceCount); // display! ret = prussdrv_exec_program(PRU_NUM, "./driver.bin"); if (ret == -1) { printf("failed to open driver.bin\n"); exit(1); } printf("running...\nhit enter to stop.\n"); getchar(); // stall until enter is hit // cleanup // disable pru prussdrv_pru_disable(PRU_NUM); // exit PRU interfaces prussdrv_exit(); pru_ctrl_exit(); // undo memory mapping munmap(ddrMem, get_ddr_size()); close(mem_fd); return 0; }