예제 #1
0
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;
}
예제 #2
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();
}