int main(int argc, char **argv) { fd_set rdfs; int s; canid_t mask = 0; canid_t value = 0; long currcms = 0; long lastcms = 0; unsigned char quiet = 0; int opt, ret; struct timeval timeo, start_tv, tv; struct sockaddr_can addr; struct ifreq ifr; int i; signal(SIGTERM, sigterm); signal(SIGHUP, sigterm); signal(SIGINT, sigterm); for (i=0; i < 2048 ;i++) /* default: check all CAN-IDs */ do_set(i, ENABLE); while ((opt = getopt(argc, argv, "m:v:r:t:h:l:qbBcf?")) != -1) { switch (opt) { case 'm': sscanf(optarg, "%x", &mask); break; case 'v': sscanf(optarg, "%x", &value); break; case 'r': readsettings(optarg, 0); /* no BCM-setting here */ break; case 't': sscanf(optarg, "%ld", &timeout); break; case 'h': sscanf(optarg, "%ld", &hold); break; case 'l': sscanf(optarg, "%ld", &loop); break; case 'q': quiet = 1; break; case 'b': binary = 1; binary_gap = 0; break; case 'B': binary = 1; binary_gap = 1; break; case 'c': color = 1; break; case 'f': filter_id_only = 1; break; case '?': break; default: fprintf(stderr, "Unknown option %c\n", opt); break; } } if (optind == argc) { print_usage(basename(argv[0])); exit(0); } if (mask || value) { for (i=0; i < 2048 ;i++) { if ((i & mask) == (value & mask)) do_set(i, ENABLE); else do_clr(i, ENABLE); } } if (quiet) for (i=0; i < 2048 ;i++) do_clr(i, ENABLE); if (strlen(argv[optind]) >= IFNAMSIZ) { printf("name of CAN device '%s' is too long!\n", argv[optind]); return 1; } interface = argv[optind]; if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM)) < 0) { perror("socket"); return 1; } addr.can_family = AF_CAN; if (strcmp(ANYDEV, argv[optind])) { strcpy(ifr.ifr_name, argv[optind]); if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { perror("SIOCGIFINDEX"); exit(1); } addr.can_ifindex = ifr.ifr_ifindex; } else addr.can_ifindex = 0; /* any can interface */ if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("connect"); return 1; } for (i=0; i < 2048 ;i++) /* initial BCM setup */ if (is_set(i, ENABLE)) rx_setup(s, i); gettimeofday(&start_tv, NULL); tv.tv_sec = tv.tv_usec = 0; printf("%s", CSR_HIDE); /* hide cursor */ while (running) { FD_ZERO(&rdfs); FD_SET(0, &rdfs); FD_SET(s, &rdfs); timeo.tv_sec = 0; timeo.tv_usec = 100000 * loop; if ((ret = select(s+1, &rdfs, NULL, NULL, &timeo)) < 0) { //perror("select"); running = 0; continue; } gettimeofday(&tv, NULL); currcms = (tv.tv_sec - start_tv.tv_sec) * 10 + (tv.tv_usec / 100000); if (FD_ISSET(0, &rdfs)) running &= handle_keyb(s); if (FD_ISSET(s, &rdfs)) running &= handle_bcm(s, currcms); if (currcms - lastcms >= loop) { running &= handle_timeo(s, currcms); lastcms = currcms; } } printf("%s", CSR_SHOW); /* show cursor */ close(s); return 0; }
void init() { set_and_wait(ma.mode.enable); set_and_wait(bufman.mode.enable); cpmu.control.hide_pcie_function = 7; cpmu.megabit_policy.mac_clock_switch = 0; cpmu.link_aware_policy.mac_clock_switch = 0; cpmu.d0u_policy.mac_clock_switch = 0; cpmu.link_idle_policy.mac_clock_switch = 0; cpmu.no_link_or_10mb_policy.mac_clock_switch = 0; rxcpu.mode.icache_pref_en = 1; grc.rxcpu_event.word = 0xffffffff; grc.rxcpu_event.word = 0; grc.fastboot_pc.addr = 0x8008000; grc.fastboot_pc.enable = 1; grc.rxcpu_event_enable.word = 0; grc.rxcpu_event_enable.emac = 1; if (gencomm[0] == 0x4b657654) state.flags |= HANDSHAKE_MAGIC_SEEN; else state.flags &= ~HANDSHAKE_MAGIC_SEEN; grc.misc_config.timer_prescaler = 0x7f; grc.power_management_debug.perst_override = 1; if (config.flags & CLOAK_EN) cloak_engage(); if (config.flags & LOCAL_CTRL) { cfg_port.bar_ctrl.bar0_sz = 1; lgate_setup(); } else { cfg_port.bar_ctrl.bar0_sz = 0; } cfg_port.bar_ctrl.rom_bar_sz = 0x6; grc.exp_rom_addr.base = read_nvram(0x1c); if (config.flags & OPROM_EN) pci.state.rom_enable = 1; ftq.reset.word = 0xffffffff; ftq.reset.word = 0; while (ftq.reset.word); emac.mode.port_mode = 2; set_and_wait(emac.mode.en_fhde); set_and_wait(emac.mode.en_rde); set_and_wait(emac.mode.en_tde); emac.mode.magic_packet_detection = 1; emac.mode.keep_frame_in_wol = 1; emac.event_enable.link_state_changed = 1; emac.rx_mac_mode.promiscuous_mode = 1; emac.tx_mac_mode.enable_bad_txmbuf_lockup_fix = 1; emac.tx_mac_lengths.slot = 0x20; emac.tx_mac_lengths.ipg_crs = 0x2; emac.tx_mac_lengths.ipg = 0x6; emac.mii_mode.enable_constant_mdc_clock_speed = 1; emac.mii_mode.phy_address = 1; emac.mii_mode.mii_clock_count = 0xb; set_and_wait(emac.tx_mac_mode.enable); set_and_wait(emac.rx_mac_mode.enable); wdma.mode.write_dma_pci_target_abort_attention_enable = 1; wdma.mode.write_dma_pci_master_abort_attention_enable = 1; wdma.mode.write_dma_pci_parity_error_attention_enable = 1; wdma.mode.write_dma_pci_host_address_overflow_error_attention_enable = 1; wdma.mode.write_dma_pci_fifo_overrun_attention_enable = 1; wdma.mode.write_dma_pci_fifo_underrun_attention_enable = 1; wdma.mode.write_dma_pci_fifo_overwrite_attention_enable = 1; set_and_wait(wdma.mode.enable); rdma.mode.read_dma_pci_target_abort_attention_enable = 1; rdma.mode.read_dma_pci_master_abort_attention_enable = 1; rdma.mode.read_dma_pci_parity_error_attention_enable = 1; rdma.mode.read_dma_pci_host_address_overflow_error_attention_enable = 1; rdma.mode.read_dma_pci_fifo_overrun_attention_enable = 1; rdma.mode.read_dma_pci_fifo_underrun_attention_enable = 1; rdma.mode.read_dma_pci_fifo_overread_attention_enable = 1; rdma.mode.read_dma_local_memory_write_longer_than_dma_length_attention_enable = 1; rdma.mode.jumbo_2k_mmrr_mode = 1; rdma.mode.hardware_ipv6_post_dma_processing_enable = 0; rdma.mode.in_band_vtag_enable = 0; rdma.mode.post_dma_debug_enable = 1; set_and_wait(rdma.mode.enable); set_and_wait(hc.mode.enable); nv_load_mac(state.my_mac); mac_cpy(state.my_mac, (void *)0xc0000412); gencomm[0] = 0xb49a89ab; pci.command.bus_master = 1; if (config.flags & PEER_CTRL) rx_setup(); if (config.flags & BEACON_EN) beacon(); check_link(); main(); }