int mvme_open(MVME_INTERFACE **vme, int index) { BT617_TABLE *ptab; bt_devdata_t flag; int status; *vme = (MVME_INTERFACE *)malloc(sizeof(MVME_INTERFACE)); if (*vme == NULL) return MVME_NO_MEM; (*vme)->am = MVME_AM_DEFAULT; (*vme)->dmode = MVME_DMODE_DEFAULT; (*vme)->blt_mode = MVME_BLT_NONE; (*vme)->handle = 0; /* use first entry in BT617_TABLE by default */ (*vme)->table = (void *)malloc(sizeof(BT617_TABLE)*MAX_BT617_TABLES); if ((*vme)->table == NULL) return MVME_NO_MEM; memset((*vme)->table, 0, sizeof(BT617_TABLE)*MAX_BT617_TABLES); ptab = (BT617_TABLE *) (*vme)->table; ptab->am = MVME_AM_DEFAULT; bt_gen_name(index, BT_DEV_A32, ptab->devname, BT_MAX_DEV_NAME); status = bt_open(&ptab->btd, ptab->devname, BT_RDWR); if (status != BT_SUCCESS) { bt_perror(ptab->btd, status, "bt_open error"); return MVME_NO_INTERFACE; } bt_init(ptab->btd); bt_clrerr(ptab->btd); /* select swapping mode */ flag = BT_SWAP_NONE; bt_set_info(ptab->btd, BT_INFO_SWAP, flag); /* set data mode */ flag = BT_WIDTH_D32; bt_set_info(ptab->btd, BT_INFO_DATAWIDTH, flag); /* switch off block transfer */ flag = FALSE; bt_set_info(ptab->btd, BT_INFO_BLOCK, flag); return MVME_SUCCESS; }
int vme_open() { /* Open SBS VME-PCI */ status = bt_open(&btd, bt_gen_name(unit, type, &devname[0], BT_MAX_DEV_NAME), BT_RD | BT_WR); if (BT_SUCCESS != status) { bt_perror(btd, status, "Engine ERROR: Could not open SBS VME-PCI"); remove("/Applications/sirius/system/engine.lock"); return -1; } /* Clear any outstanding errors */ status = bt_clrerr(btd); if (BT_SUCCESS != status) { bt_perror(btd, status, "Engine ERROR: Could not clear errors from SBS VME-PCI"); remove("/Applications/sirius/system/engine.lock"); (void) bt_close(btd); return -1; } return 0; }
int bt617_set_am(MVME_INTERFACE *vme, int am) { int i; BT617_TABLE *ptab; bt_error_t status; bt_devdata_t flag; for (i=0 ; i<MAX_BT617_TABLES ; i++) if (((BT617_TABLE *)vme->table)[i].am == am) break; if (((BT617_TABLE *)vme->table)[i].am == am) { vme->handle = i; ptab = ((BT617_TABLE *)vme->table)+i; bt_set_info(ptab->btd, BT_INFO_DMA_AMOD, am); bt_set_info(ptab->btd, BT_INFO_PIO_AMOD, am); bt_set_info(ptab->btd, BT_INFO_MMAP_AMOD, am); return MVME_SUCCESS; } /* search free slot */ for (i=0 ; i<MAX_BT617_TABLES ; i++) if (((BT617_TABLE *)vme->table)[i].am == 0) break; if (i==MAX_BT617_TABLES) return MVME_NO_MEM; /* mode not yet open, open it */ vme->handle = i; ptab = ((BT617_TABLE *)vme->table)+i; ptab->am = am; if (am == MVME_AM_A16_SD || am == MVME_AM_A16_ND) bt_gen_name(vme->index, BT_DEV_A16, ptab->devname, BT_MAX_DEV_NAME); else if (am == MVME_AM_A24_SB || am == MVME_AM_A24_SP || am == MVME_AM_A24_SD || am == MVME_AM_A24_NB || am == MVME_AM_A24_NP || am == MVME_AM_A24_ND || am == MVME_AM_A24_SMBLT || am == MVME_AM_A24_NMBLT || am == MVME_AM_A24 || am == MVME_AM_A24_D64) bt_gen_name(vme->index, BT_DEV_A24, ptab->devname, BT_MAX_DEV_NAME); else bt_gen_name(vme->index, BT_DEV_A32, ptab->devname, BT_MAX_DEV_NAME); status = bt_open(&ptab->btd, ptab->devname, BT_RDWR); if (status != BT_SUCCESS) { bt_perror(ptab->btd, status, "bt_open error"); return MVME_NO_INTERFACE; } bt_init(ptab->btd); bt_clrerr(ptab->btd); /* select swapping mode */ flag = BT_SWAP_NONE; bt_set_info(ptab->btd, BT_INFO_SWAP, flag); /* set data mode */ flag = BT_WIDTH_D16; bt_set_info(ptab->btd, BT_INFO_DATAWIDTH, flag); /* switch off block transfer */ flag = FALSE; bt_set_info(ptab->btd, BT_INFO_BLOCK, flag); /* set amod */ bt_set_info(ptab->btd, BT_INFO_DMA_AMOD, am); bt_set_info(ptab->btd, BT_INFO_PIO_AMOD, am); bt_set_info(ptab->btd, BT_INFO_MMAP_AMOD, am); return MVME_SUCCESS; }
int fb_init() { bt_error_t status; /* Bit 3 library error return type */ char devname[BT_MAX_DEV_NAME]; /* Device to open */ bt_devdata_t flag; /* Open the device in A24 space */ bt_gen_name(0, BT_DEV_A24, devname, BT_MAX_DEV_NAME); status = bt_open(&btd, devname, BT_RDWR); if (status != BT_SUCCESS) { cm_msg(MERROR, "fb_init", "Cannot open Bit3 device driver"); return FALSE; } bt_init(btd); bt_clrerr(btd); /* map SFI memory */ status = bt_mmap(btd, &_sfi, SFI_ADDRESS, SFI_SIZE, BT_RDWR, BT_SWAP_DEFAULT); if (status != BT_SUCCESS) { cm_msg(MERROR, "fb_init", "Cannot map VME memory"); bt_close(btd); return FALSE; } /* Open the device in local memory */ bt_gen_name(0, BT_DEV_LM, devname, BT_MAX_DEV_NAME); status = bt_open(&btd_lm, devname, BT_RDWR); if (status != BT_SUCCESS) { cm_msg(MERROR, "fb_init", "Cannot open Bit3 device for local memory"); return FALSE; } bt_clrerr(btd_lm); /* map local memory */ status = bt_mmap(btd_lm, &remote_ram_buffer, 0, REMOTE_RAM_SIZE, BT_RDWR, BT_SWAP_DEFAULT); if (status != BT_SUCCESS) { cm_msg(MERROR, "fb_init", "Cannot map local memory"); bt_close(btd); return FALSE; } /* clear local memory */ memset(remote_ram_buffer, 0, REMOTE_RAM_SIZE); /* force D32 mode */ bt_get_info(btd, BT_INFO_MMAP_AMOD, &flag); flag = BT_AMOD_A24_SD; bt_set_info(btd, BT_INFO_MMAP_AMOD, flag); /* sequencer reset */ SFI_OUT(SFI_SEQUENCER_RESET, 0); /* arbitration level */ // SFI_OUT(SFI_FASTBUS_ARBITRATION_LEVEL_REGISTER, 0x15); SFI_OUT(SFI_FASTBUS_ARBITRATION_LEVEL_REGISTER, 0xBF); /* timeout */ SFI_OUT(SFI_FASTBUS_TIMEOUT_REGISTER, 0x73); /* sequencer enable */ SFI_OUT(SFI_SEQUENCER_ENABLE, 0); /* switch off all output */ SFI_OUT(SFI_CLEAR_BOTH_LCA1_TEST_REGISTER, 0); /* clear registers */ SFI_OUT(SFI_RESET_REGISTER_GROUP_LCA2, 0); return SUCCESS; }