⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nvbuild.c

📁 详细介绍了一篇关于pci开发的接口芯片
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifndef NO_MULTI_FUNCTION
  if (cur_nvram.header_type.multi_function)
    strcpy(multi_function_agent, "Y");
  else
    strcpy(multi_function_agent, "N");
#endif
  if (cur_nvram.bist.bist_capable)
    strcpy(bist_capable, "Y");
  else
    strcpy(bist_capable, "N");

  sprintf(intr_line, "%02.2X", cur_nvram.intr_line);
  sprintf(min_grant, "%02.2X", cur_nvram.min_grant);
  sprintf(max_latency, "%02.2X", cur_nvram.max_latency);
  if (current_device_type == S5933)
    sprintf(exp_rom_size, "%8.8lx", exp_rom_values[exp_rom_subscr]);
  else
    sprintf(exp_rom_size, "%8.8lx", exp_rom_values_5920[exp_rom_subscr]);
  sprintf(class_code, "%2.2X", class_codes[class_code_subscr]);
  sprintf(subclass_code, "%2.2X", subclass_codes[class_code_subscr][subclass_code_subscr]);
  sprintf(intr_pin, "%d", intr_pin_subscr);

#define COL1  27
#define COL2  60
#define ROW_INC 2

  do {
    row = 1;

    /* Mark beginning of form. */
    winpbeg(DGREY|_LGREY,WHITE|_CYAN);

    /* Display prompts and define fields. */
    wprints(row, COL1 - 16, menu_window_color, "Vendor ID (Hex)");
    winpdef(row, COL1, vendor_id, "HHHH", 'U', 2, check_vendor_id, H_VENDOR_ID);

    wprints(row, COL2 - 16, menu_window_color, "Device ID (Hex)");
    winpdef(row, COL2, device_id, "HHHH", 'U', 2, check_device_id, H_DEVICE_ID);

    if (current_device_type != S5933)
    {
      row += ROW_INC;
      wprints( row,COL1 - 26,menu_window_color,"Subsystem Vendor ID (Hex)");
      winpdef( row,COL1,subsystem_vendor_id,"HHHH",'U',2,check_subsys_vendor_id,H_SUBSYS_VENDOR_ID);

      wprints( row,COL2 - 19,menu_window_color,"Subsystem ID (Hex)");
      winpdef( row,COL2,subsystem_device_id,"HHHH",'U',2,check_subsys_device_id,H_SUBSYS_DEVICE_ID);
    }

    row += ROW_INC;
    wprints(row,COL1 - 18, menu_window_color,"Revision ID (Hex)");
    winpdef(row,COL1,revision_id,"HH",'U',2,check_revision_id,H_REVISION_ID);

    row += ROW_INC;
    wprints(row, COL1 - 16, menu_window_color,"Base Class Code");
    wprints(row, COL1 + 3, menu_qsel_color, class_code_messages[class_code_subscr]);
    winpdef(row,COL1,class_code,"HH",0,2,check_class_code,H_BASE_CLASS_CODE);
    winpfba(pre_class_code,post_class_code);

    row += ROW_INC;
    wprints(row, COL1 - 15,menu_window_color,"Sub-Class Code");
    wprints(row, COL1 + 3, menu_qsel_color, subclass_code_messages[class_code_subscr][subclass_code_subscr]);
    winpdef(row, COL1,subclass_code,"HH",0,2,check_subclass_code,H_SUBCLASS_CODE);
    winpfba(pre_subclass_code,post_subclass_code);
    subclass_field = winpfcurr();

    row += ROW_INC;
    wprints(row, COL1 - 22, menu_window_color,"Programming I/F (Hex)");
    winpdef(row,COL1,prog_if,"HH",'U',2,NULL,H_PROG_IF);

    wprints(row,COL2 - 14, menu_window_color,"BIST Capable?");
    winpdef(row,COL2,bist_capable,"Y",'U',2,check_y_n,H_BIST_CAPABLE);

    row += ROW_INC;
    wprints(row,COL1 - 20, menu_window_color,"Latency Timer (Hex)");
    winpdef(row,COL1,latency_timer,"HH",'U',2,check_latency_timer,H_LATENCY_TIMER);

    // 5920 cannot be a multi-function device
    if (current_device_type == S5933) {
#ifndef NO_MULTI_FUNCTION
        wprints(row,COL2 - 16, menu_window_color,"Multi-function?");
        winpdef(row,COL2,multi_function_agent,"Y",'U',2,check_y_n,H_MULTI_FUNCTION);
#endif
    }

    row += ROW_INC;
    wprints(row,COL1 - 21,menu_window_color,"Interrupt Line (Hex)");
    winpdef(row,COL1,intr_line,"HH",'U',2,NULL,H_INTERRUPT_LINE);

    wprints(row,COL2 - 14, menu_window_color,"Interrupt Pin");
    wprints(row, COL2 + 2, menu_qsel_color, intr_pin_codes[intr_pin_subscr]);
    winpdef(row,COL2,intr_pin, "9",'U',2,check_intr_pin,H_INTERRUPT_PIN);
    winpfba(pre_intr_pin,post_intr_pin);

    row += ROW_INC;
    wprints(row, COL1 - 20,menu_window_color,"Minimum Grant (Hex)");
    winpdef(row,COL1,min_grant,"HH",'U',2,NULL,H_MINIMUM_GRANT);

    wprints(row,COL2 - 22,menu_window_color,"Maximum Latency (Hex)");
    winpdef(row,COL2,max_latency,"HH",'U',2,NULL,H_MAXIMUM_LATENCY);

    row += ROW_INC;
    wprints(row, COL1 - 19,menu_window_color,"Expansion ROM Size");
    if (current_device_type == S5933)
      wprints(row, COL1 + 9, menu_qsel_color, exp_rom_codes[exp_rom_subscr]);
    else
      wprints(row, COL1 + 9, menu_qsel_color, exp_rom_codes_5920[exp_rom_subscr]);
    winpdef(row,COL1,exp_rom_size,"HHHHHHHH",0,2,check_exp_rom,H_EXP_ROM);
    winpfba(pre_exp_rom,post_exp_rom);

    /* Define alternate keyboard get function. */
    winpkey(get_key,&key);

    /* Mark end of form and process it.  If [Esc] was pressed, */
    /* then don't bother with the confirmation message.        */
    if (winpread())
		break;

    /* Test to see if [F10] was pressed.  If   */
    /* so, don't display confirmation message. */
    if (key==0x4400)
      ch = 'Y';
    else {
      /* Display confirmation message. */
      if (!wopen(20,23,22,56,0,WHITE|_CYAN,WHITE|_CYAN))
	  	error_exit(1);
      add_shadow();
      wputs("\n Is this information correct? \033A\076Y\b");
      clearkeys();
      ch = wgetchf("YN", 'Y');
      wclose();
    }
  } while(ch!='Y');

  if (ch == 'Y') {
    sscanf(vendor_id,   "%x", &tmp_int);
    cur_nvram.vendor_id = tmp_int;

    sscanf(subsystem_vendor_id,   "%x", &tmp_int);
    cur_nvram.subsystem_vendor_id = tmp_int;

    sscanf(device_id,   "%x", &tmp_int);
    cur_nvram.device_id = tmp_int;

    sscanf(subsystem_device_id,   "%x", &tmp_int);
    cur_nvram.subsystem_device_id = tmp_int;

    sscanf(revision_id, "%x", &tmp_int);
    cur_nvram.revision_id = tmp_int;

    cur_nvram.class_code.base_class = class_codes[class_code_subscr];
    cur_nvram.class_code.subclass = subclass_codes[class_code_subscr][subclass_code_subscr];
    sscanf(prog_if, "%x", &tmp_int);
    cur_nvram.class_code.prog_if = tmp_int;

    sscanf(latency_timer, "%x", &tmp_int);
    cur_nvram.latency_timer = tmp_int;

    cur_nvram.header_type.multi_function =
#ifndef NO_MULTI_FUNCTION
    	(multi_function_agent[0] == 'Y');
#else
      	FALSE;
#endif

    cur_nvram.bist.bist_capable = (bist_capable[0] == 'Y');
    sscanf(intr_line, "%x", &tmp_int);
    cur_nvram.intr_line = tmp_int;

    cur_nvram.intr_pin = intr_pin_subscr;

    sscanf(min_grant, "%x", &tmp_int);
    cur_nvram.min_grant = tmp_int;

    sscanf(max_latency, "%x", &tmp_int);
    cur_nvram.max_latency = tmp_int;

    if (current_device_type == S5933)
      cur_nvram.exp_rom_size = exp_rom_values[exp_rom_subscr];
    else
      cur_nvram.exp_rom_size = exp_rom_values_5920[exp_rom_subscr];
  }
  whelpopc();
  wclose();
  hidecur();
  wunhide(title_window);
  wunhide(edit_menu_window);
}

STATIC int
check_device_id(char *device_id_ch)
{
	int device_id;

	sscanf(device_id_ch, "%x", &device_id);
	if ((device_id & 0xFFFF) == 0xffff) {
		wperror("0xffff is an invalid DEVICE ID", YES);
		return(1);
	}
	if (device_id != default_nvram.device_id)
		wperror("Changes to Device ID register are NOT RECOMMENDED!!!\n"
			"See Development Kit Documentation.", YES);
	return(0);
}

STATIC int
check_subsys_device_id(char *device_id_ch)
{
	int device_id;

	sscanf(device_id_ch, "%x", &device_id);

	if ((device_id & 0xFFFF) == 0xffff) {
		wperror("0xffff is an invalid DEVICE ID", YES);
		return(1);
	}
	if (device_id != default_nvram.device_id)
		wperror("RECOMMENDED: use a unique value for each of your add-in "
			"card designs.", NO);
	return(0);
}

STATIC int
check_vendor_id(char *vendor_id_ch)
{
	int vendor_id;

	sscanf(vendor_id_ch, "%x", &vendor_id);

	if ((vendor_id & 0xFFFF) == 0xffff) {
		wperror("0xffff is an invalid VENDOR ID", YES);
		return(1);
	}
	if (vendor_id != AMCC_VENDOR_ID)
		wperror("Changes to Vendor ID register are NOT RECOMMENDED!!!\n"
				"See Development Kit Documentation.", NO);
	return(0);
}

STATIC int
check_subsys_vendor_id(char *vendor_id_ch)
{
	int vendor_id;

	sscanf(vendor_id_ch, "%x", &vendor_id);

	if ((vendor_id & 0xFFFF) == 0xffff) {
		wperror("0xffff is an invalid VENDOR ID", YES);
		return(1);
	}
	if (vendor_id != AMCC_VENDOR_ID)
		wperror("RECOMMENDED: use your unique Vendor ID (from PCI SIG)\n"
			"for the subsystem register.", NO);
	return(0);
}

STATIC int
check_revision_id(char *revision_id_ch)
{
	int revision_id;

	sscanf(revision_id_ch, "%x", &revision_id);
	if (revision_id != default_nvram.revision_id)
		wperror("Changes to revision ID register are NOT RECOMMENDED!!!\n"
			"See Development Kit Documentation.", NO);
	return(0);
}

STATIC int
check_class_code(char *class_code_ch)
{
	int class_code, retval, index, row, col;

	sscanf(class_code_ch, "%x", &class_code);

	determine_row_col(&row, &col, FALSE);
	for (index = 0; index < NUMBER_CLASS_CODES; index++) {
		if (class_code == class_codes[index]) {
			retval = 0;
			if (index != class_code_subscr) {
				class_code_subscr = index;
				wgotoxy(row, col + 3);
				wclreol();
				wprints(row, col + 3, menu_qsel_color,
					class_code_messages[class_code_subscr]);
				subclass_code_subscr = 0;
				strcpy(subclass_code, "00");
				strcpy(subclass_field->buf, subclass_code);
				wgotoxy(row + ROW_INC, col + 3);
				wclreol();
				wprints(row + ROW_INC, col + 3, menu_qsel_color, subclass_code_messages[class_code_subscr][subclass_code_subscr]);
			}
		}
	}
	return(retval);
}

STATIC int
check_subclass_code(char *subclass_code_ch)
{
	int subclass_code, retval, index, row, col;

	retval = 1;
	sscanf(subclass_code_ch, "%x", &subclass_code);

	determine_row_col(&row, &col, FALSE);
	for (index = 0; index < NUMBER_SUBCLASS_CODES; index++)
		if (subclass_code == subclass_codes[class_code_subscr][index]) {
			retval = 0;
			subclass_code_subscr = index;
			wgotoxy(row, col + 3);
			wclreol();
			wprints(row, col + 3, menu_qsel_color,
				subclass_code_messages[class_code_subscr][subclass_code_subscr]);
			return(0);
		}
	return(1);
}

void
pre_subclass_code(void)
{
	field_edit_menu = TRUE;
	field_edit_menu_process = pick_subclass_code;
	disp_menu_pick();
}

void
post_subclass_code(void)
{
	field_edit_menu = FALSE;
	field_edit_menu_process = NULL;
	del_menu_pick();
}

// Generic pop-ups
STATIC char *current_generic_pop_up_title;

STATIC void
generic_pop_up_title(void)
{
	wtitle(current_generic_pop_up_title, TCENTER, submenu_border_color);
}

STATIC void
generic_pop_up(char **selection_strings, char *submenu_title)
{
	int subscr, row, col, erow, ecol, longest, count;
	int current_selection_subscr;
	struct _field_t *winpf;
	char str[9];

	count = 0;
	current_generic_pop_up_title = submenu_title;
	determine_row_col(&row, &col, TRUE);

	// Determine current field contents
	if (!(winpf = winpfcurr()))
		current_selection_subscr = atoi(winpf->buf);

	whelpush();
	longest = strlen(submenu_title);

	// Determine number of entries & longest entry
	for (subscr = 0; selection_strings[subscr]; subscr++) {
		count++;
		if (strlen(selection_strings[subscr]) > longest)
			longest = strlen(selection_strings[subscr]);
	}

	row += 2;
	col++;
	erow = row + 1 + count;
	while (erow > 23) {
		row--;
		erow--;
	}

	ecol = col + 1 + longest;
	while (ecol > 77) {
		col--;
		ecol--;
	}

	subscr = wpickstr(row, col, erow, ecol, 0, submenu_border_color,
				submenu_window_color, submenu_selection_color,
					selection_strings, current_selection_subscr,
						generic_pop_up_title);
	kbput(0x4700);
	if (subscr == -1)
		subscr = current_selection_subscr;
	sprintf(str, "%1d", subscr);
	kbputs(str);
	whelpop();
}

STATIC void
post_generic_pop_up(void)
{
	field_edit_menu = FALSE;
	field_edit_menu_process = NULL;
	del_menu_pick();
}

// Add on control - generic popup information
// Strings to display in pop-up
STATIC char *add_on_control_strs[] = {
	"0 - Add-on Initiated Bus Mastering",
	"1 - PCI Initiated Bus Mastering",
	NULL
};

STATIC void
pick_add_on_control(void)
{
	generic_pop_up(add_on_control_strs, "[ Choose Bus Master Register Access ]");
}

STATIC void
pre_add_on_control(void)
{
	field_edit_menu = TRUE;
	field_edit_menu_process = pick_add_on_control;
	disp_menu_pick();
}

// WRFIFO_ENABLE control - generic popup information
// Strings to display in pop-up
STATIC char *wrfifo_enable_strs[] = {
	"0 - Synchronous Mode",
	"1 - Asynchronous Mode",
	NULL
};

STATIC void
pick_wrfifo_enable(void)
{
	generic_pop_up(wrfifo_enable_strs, "[ Choose WRFIFO#, WR# Operation ]");
}

STATIC void
pre_wrfifo_enable(void)
{
	field_edit_menu = TRUE;
	field_edit_menu_process = pick_wrfifo_enable;
	disp_menu_pick();
}

// RDFIFO_ENABLE control - generic popup information
// Strings to display in pop-up
STATIC char *rdfifo_enable_strs[] = {
	"0 - Synchronous Mode",
	"1 - Asynchronous Mode",
	NULL
};

STATIC void
pick_rdfifo_enable(void)
{
	generic_pop_up(rdfifo_enable_strs, "[ Choose RDFIFO#, RD# Operation ]");
}

STATIC void
pre_rdfifo_enable(void)
{
	field_edit_menu = TRUE;
	field_edit_menu_process = pick_rdfifo_enable;
	disp_menu_pick();
}

// LATENCY_TIMER_TIMEOUT control - generic popup information
// Strings to display in pop-up
STATIC char *latency_timer_timeout_strs[] = {
	"0 - Disable PCI Latency Timer Timeout",
	"1 - Enable PCI Latency Timer Timeout",
	NULL
};

STATIC void
pick_latency_timer_timeout(void)
{
	generic_pop_up(latency_timer_timeout_strs,
		"[ Choose Target Latency Timer Control ]");
}

STATIC void
pre_latency_timer_timeout(void)
{
	field_edit_menu = TRUE;
	field_edit_menu_process = pick_latency_timer_timeout;
	disp_menu_pick();
}

// WRMODE control - generic popup information
// Strings to display in pop-up
STATIC char *wrmode_strs[] = {
	"0 - Disconnect On FIFO Full",
	"1 - Assert TRDY# When Full",
	NULL
};

STATIC void
pick_wrmode(void)
{
	generic_pop_up(wrmode_strs, "[ Choose WRMODE#, WR# Operation ]");
}

STATIC void
pre_wrmode(void)
{
	field_edit_menu = TRUE;
	field_edit_menu_process = pick_wrmode;
	disp_menu_pick();
}

// RDRETRY control - generic popup information
// Strings to display in pop-up
STATIC char *rdretry_strs[] = {
	"0 - Hold Data Until Read",
	"1 - Allow Flush On Next Read",
	NULL
};

STATIC void
pick_rdretry(void)
{
	generic_pop_up(rdretry_strs, "[ Choose RDRETRY#, RD# Operation ]");
}

STATIC void
pre_rdretry(void)
{
	field_edit_menu = TRUE;
	field_edit_menu_process = pick_rdretry;
	disp_menu_pick();
}

#define S5933_RDFIFO	"RDFIFO#, RD# Operation"
#define S5933_WRFIFO	"WRFIFO#, WR# Operation"
#define	S5920_RETRY		"RDRETRY#, RD# Operation"
#define	S5920_WRMODE	"WRMODE #, WR# Operation"

/*
** Edit all Location 45 bits
*/
STATIC void
edit_loc_45_config_bits(void)
{
	char latency_timer_timeout[2];
	char add_on_control[31];
	char wrfifo_enable[2];
	char rdfifo_enable[2]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -