int __prussdrv_memmap_init(void) { int i, fd; char hexstring[PRUSS_UIO_PARAM_VAL_LEN]; if (prussdrv.mmap_fd == 0) { for (i = 0; i < NUM_PRU_HOSTIRQS; i++) { if (prussdrv.fd[i]) break; } if (i == NUM_PRU_HOSTIRQS) return -1; else prussdrv.mmap_fd = prussdrv.fd[i]; } for (i=0; i<UIO_OPEN_TIMEOUT; i++) { fd = open(PRUSS_UIO_DRV_PRUSS_BASE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.pruss_phys_base = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); break; } sleep(1); } if (i==UIO_OPEN_TIMEOUT) { DEBUG_PRINTF("open %s: timeout\n", PRUSS_UIO_DRV_PRUSS_BASE); return -2; } fd = open(PRUSS_UIO_DRV_PRUSS_SIZE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.pruss_map_size = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -3; prussdrv.pru0_dataram_base = mmap(0, prussdrv.pruss_map_size, PROT_READ | PROT_WRITE, MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_PRUSS); prussdrv.version = __pruss_detect_hw_version((unsigned int *) prussdrv.pru0_dataram_base); switch (prussdrv.version) { case PRUSS_V1: { DEBUG_PRINTF(PRUSS_V1_STR "\n"); prussdrv.pru0_dataram_phy_base = AM18XX_DATARAM0_PHYS_BASE; prussdrv.pru1_dataram_phy_base = AM18XX_DATARAM1_PHYS_BASE; prussdrv.intc_phy_base = AM18XX_INTC_PHYS_BASE; prussdrv.pru0_control_phy_base = AM18XX_PRU0CONTROL_PHYS_BASE; prussdrv.pru0_debug_phy_base = AM18XX_PRU0DEBUG_PHYS_BASE; prussdrv.pru1_control_phy_base = AM18XX_PRU1CONTROL_PHYS_BASE; prussdrv.pru1_debug_phy_base = AM18XX_PRU1DEBUG_PHYS_BASE; prussdrv.pru0_iram_phy_base = AM18XX_PRU0IRAM_PHYS_BASE; prussdrv.pru1_iram_phy_base = AM18XX_PRU1IRAM_PHYS_BASE; } break; case PRUSS_V2: { DEBUG_PRINTF(PRUSS_V2_STR "\n"); prussdrv.pru0_dataram_phy_base = AM33XX_DATARAM0_PHYS_BASE; prussdrv.pru1_dataram_phy_base = AM33XX_DATARAM1_PHYS_BASE; prussdrv.intc_phy_base = AM33XX_INTC_PHYS_BASE; prussdrv.pru0_control_phy_base = AM33XX_PRU0CONTROL_PHYS_BASE; prussdrv.pru0_debug_phy_base = AM33XX_PRU0DEBUG_PHYS_BASE; prussdrv.pru1_control_phy_base = AM33XX_PRU1CONTROL_PHYS_BASE; prussdrv.pru1_debug_phy_base = AM33XX_PRU1DEBUG_PHYS_BASE; prussdrv.pru0_iram_phy_base = AM33XX_PRU0IRAM_PHYS_BASE; prussdrv.pru1_iram_phy_base = AM33XX_PRU1IRAM_PHYS_BASE; prussdrv.pruss_sharedram_phy_base = AM33XX_PRUSS_SHAREDRAM_BASE; prussdrv.pruss_cfg_phy_base = AM33XX_PRUSS_CFG_BASE; prussdrv.pruss_uart_phy_base = AM33XX_PRUSS_UART_BASE; prussdrv.pruss_iep_phy_base = AM33XX_PRUSS_IEP_BASE; prussdrv.pruss_ecap_phy_base = AM33XX_PRUSS_ECAP_BASE; prussdrv.pruss_miirt_phy_base = AM33XX_PRUSS_MIIRT_BASE; prussdrv.pruss_mdio_phy_base = AM33XX_PRUSS_MDIO_BASE; } break; default: DEBUG_PRINTF(PRUSS_UNKNOWN_STR "\n"); } #define ADDR_OFFSET(a,o) ((void*) ((char*) (a) + (o))) prussdrv.pru1_dataram_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pru1_dataram_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.intc_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.intc_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pru0_control_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pru0_control_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pru0_debug_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pru0_debug_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pru1_control_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pru1_control_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pru1_debug_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pru1_debug_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pru0_iram_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pru0_iram_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pru1_iram_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pru1_iram_phy_base - prussdrv.pru0_dataram_phy_base); if (prussdrv.version == PRUSS_V2) { prussdrv.pruss_sharedram_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pruss_sharedram_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pruss_cfg_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pruss_cfg_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pruss_uart_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pruss_uart_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pruss_iep_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pruss_iep_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pruss_ecap_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pruss_ecap_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pruss_miirt_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pruss_miirt_phy_base - prussdrv.pru0_dataram_phy_base); prussdrv.pruss_mdio_base = ADDR_OFFSET(prussdrv.pru0_dataram_base, prussdrv.pruss_mdio_phy_base - prussdrv.pru0_dataram_phy_base); } #ifndef DISABLE_L3RAM_SUPPORT fd = open(PRUSS_UIO_DRV_L3RAM_BASE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.l3ram_phys_base = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -4; fd = open(PRUSS_UIO_DRV_L3RAM_SIZE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.l3ram_map_size = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -5; prussdrv.l3ram_base = mmap(0, prussdrv.l3ram_map_size, PROT_READ | PROT_WRITE, MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_L3RAM); #endif fd = open(PRUSS_UIO_DRV_EXTRAM_BASE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.extram_phys_base = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -6; fd = open(PRUSS_UIO_DRV_EXTRAM_SIZE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.extram_map_size = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -7; prussdrv.extram_base = mmap(0, prussdrv.extram_map_size, PROT_READ | PROT_WRITE, MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_EXTRAM); return 0; }
int __prussdrv_memmap_init(void) { int i, fd; char hexstring[PRUSS_UIO_PARAM_VAL_LEN]; if (prussdrv.mmap_fd == 0) { for (i = 0; i < NUM_PRU_HOSTIRQS; i++) { if (prussdrv.fd[i]) break; } if (i == NUM_PRU_HOSTIRQS) return -1; else prussdrv.mmap_fd = prussdrv.fd[i]; } fd = open(PRUSS_UIO_DRV_PRUSS_BASE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.pruss_phys_base = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -1; fd = open(PRUSS_UIO_DRV_PRUSS_SIZE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.pruss_map_size = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -1; prussdrv.pru0_dataram_base = mmap(0, prussdrv.pruss_map_size, PROT_READ | PROT_WRITE, MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_PRUSS); prussdrv.version = __pruss_detect_hw_version(prussdrv.pru0_dataram_base); switch (prussdrv.version) { case PRUSS_V1: { printf("AM18XX\n"); prussdrv.pru0_dataram_phy_base = AM18XX_DATARAM0_PHYS_BASE; prussdrv.pru1_dataram_phy_base = AM18XX_DATARAM1_PHYS_BASE; prussdrv.intc_phy_base = AM18XX_INTC_PHYS_BASE; prussdrv.pru0_control_phy_base = AM18XX_PRU0CONTROL_PHYS_BASE; prussdrv.pru0_debug_phy_base = AM18XX_PRU0DEBUG_PHYS_BASE; prussdrv.pru1_control_phy_base = AM18XX_PRU1CONTROL_PHYS_BASE; prussdrv.pru1_debug_phy_base = AM18XX_PRU1DEBUG_PHYS_BASE; prussdrv.pru0_iram_phy_base = AM18XX_PRU0IRAM_PHYS_BASE; prussdrv.pru1_iram_phy_base = AM18XX_PRU1IRAM_PHYS_BASE; } break; case PRUSS_V2: { printf("AM33XX\n"); prussdrv.pru0_dataram_phy_base = AM33XX_DATARAM0_PHYS_BASE; prussdrv.pru1_dataram_phy_base = AM33XX_DATARAM1_PHYS_BASE; prussdrv.intc_phy_base = AM33XX_INTC_PHYS_BASE; prussdrv.pru0_control_phy_base = AM33XX_PRU0CONTROL_PHYS_BASE; prussdrv.pru0_debug_phy_base = AM33XX_PRU0DEBUG_PHYS_BASE; prussdrv.pru1_control_phy_base = AM33XX_PRU1CONTROL_PHYS_BASE; prussdrv.pru1_debug_phy_base = AM33XX_PRU1DEBUG_PHYS_BASE; prussdrv.pru0_iram_phy_base = AM33XX_PRU0IRAM_PHYS_BASE; prussdrv.pru1_iram_phy_base = AM33XX_PRU1IRAM_PHYS_BASE; prussdrv.pruss_sharedram_phy_base = AM33XX_PRUSS_SHAREDRAM_BASE; prussdrv.pruss_cfg_phy_base = AM33XX_PRUSS_CFG_BASE; prussdrv.pruss_uart_phy_base = AM33XX_PRUSS_UART_BASE; prussdrv.pruss_iep_phy_base = AM33XX_PRUSS_IEP_BASE; prussdrv.pruss_ecap_phy_base = AM33XX_PRUSS_ECAP_BASE; prussdrv.pruss_miirt_phy_base = AM33XX_PRUSS_MIIRT_BASE; prussdrv.pruss_mdio_phy_base = AM33XX_PRUSS_MDIO_BASE; } break; default: printf("UNKNOWN\n"); } prussdrv.pru1_dataram_base = prussdrv.pru0_dataram_base + prussdrv.pru1_dataram_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.intc_base = prussdrv.pru0_dataram_base + prussdrv.intc_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pru0_control_base = prussdrv.pru0_dataram_base + prussdrv.pru0_control_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pru0_debug_base = prussdrv.pru0_dataram_base + prussdrv.pru0_debug_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pru1_control_base = prussdrv.pru0_dataram_base + prussdrv.pru1_control_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pru1_debug_base = prussdrv.pru0_dataram_base + prussdrv.pru1_debug_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pru0_iram_base = prussdrv.pru0_dataram_base + prussdrv.pru0_iram_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pru1_iram_base = prussdrv.pru0_dataram_base + prussdrv.pru1_iram_phy_base - prussdrv.pru0_dataram_phy_base; if (prussdrv.version == PRUSS_V2) { prussdrv.pruss_sharedram_base = prussdrv.pru0_dataram_base + prussdrv.pruss_sharedram_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pruss_cfg_base = prussdrv.pru0_dataram_base + prussdrv.pruss_cfg_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pruss_uart_base = prussdrv.pru0_dataram_base + prussdrv.pruss_uart_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pruss_iep_base = prussdrv.pru0_dataram_base + prussdrv.pruss_iep_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pruss_ecap_base = prussdrv.pru0_dataram_base + prussdrv.pruss_ecap_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pruss_miirt_base = prussdrv.pru0_dataram_base + prussdrv.pruss_miirt_phy_base - prussdrv.pru0_dataram_phy_base; prussdrv.pruss_mdio_base = prussdrv.pru0_dataram_base + prussdrv.pruss_mdio_phy_base - prussdrv.pru0_dataram_phy_base; } #ifndef DISABLE_L3RAM_SUPPORT fd = open(PRUSS_UIO_DRV_L3RAM_BASE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.l3ram_phys_base = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -1; fd = open(PRUSS_UIO_DRV_L3RAM_SIZE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.l3ram_map_size = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -1; prussdrv.l3ram_base = mmap(0, prussdrv.l3ram_map_size, PROT_READ | PROT_WRITE, MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_L3RAM); #endif fd = open(PRUSS_UIO_DRV_EXTRAM_BASE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.extram_phys_base = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -1; fd = open(PRUSS_UIO_DRV_EXTRAM_SIZE, O_RDONLY); if (fd >= 0) { read(fd, hexstring, PRUSS_UIO_PARAM_VAL_LEN); prussdrv.extram_map_size = strtoul(hexstring, NULL, HEXA_DECIMAL_BASE); close(fd); } else return -1; prussdrv.extram_base = mmap(0, prussdrv.extram_map_size, PROT_READ | PROT_WRITE, MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_EXTRAM); return 0; }