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

📄 iotest.c

📁 2 HP PCI热插拔代码 HP内部珍贵资料!
💻 C
字号:
/**************************************************************************** Copyright (c) 2000, 2001 Compaq Computer Corporation, ALL RIGHTS RESERVED.* Compaq Confidential******************************************************************************  @doc**  @module  : iotest.c**  Title    : PCI HOT PLUG COMMAND LINE INTERFACE**  Version  : 1.0**  Author   : Mark Simpson**  Function : To provide a commandline interface to the Linux Hot Plug driver.******************************************************************************/#include <stdio.h>#include <stdlib.h>#include <sys/fcntl.h>#include <errno.h>#include <signal.h> typedef unsigned char u8;typedef unsigned short u16;typedef unsigned int u32;#include "cpqphpd_ioctl.h"#define ERROR_VAL	-1#define SLOT_INIT 	100#define CI 		1#define CR 		2#define CRR 		3#define CA 		4#define CAR 		5#define PDF 		6#define PDU 		7#define PDUR 		8#define SS 		9#define SSR 		10#define SI 		11#define SIR 		12#define STAT 		13#define STATR 		14#define SF 		15#define SFR 		16#define PCIRSS 		17#define PCIRSSR 	18#define SCC 		19#define RSS 		20#define RSSR 		21#define LOGEVT 		22#define HLTHAVAIL 	23#define HLTHUNAVAIL 	24#define SETAS 		25#define SBDCFG 		26#define NBIVERB_DO_SCAN 27#define GUI_BACK_DOOR 28#define SBDUNLOAD 29/******************************************************** * GLOBAL VARIABLES ********************************************************/int OK = 0;int NO_OK = -1;int dev_hpc = 0;int cmd = ERROR_VAL;int slot_number = ERROR_VAL;typedef struct MSG_DATA_STRUCT {	int status;} MSG_DATA;MSG_DATA data;struct sigaction sact, osact;char* msgMap[] = {"blank", "CI", "CR", "CRR", "CA", "CAR", "PDF", "PDU",		 "PDUR", "SS", "SSR", "SI", "SIR", "STAT", "STATR", "SF",		 "SFR", "PCIRSS", "PCIRSSR", "SCC", "RSS", "RSSR", "LOGEVT",		 "HLTHAVAIL", "HLTHUNAVAIL", "SETAS", "SBDCFG", "NBIVERB_DO_SCAN", "GUI_BACK_DOOR", "SBDUNLOAD"};/********************************************************/// function prototypesvoid print_help(char); void signal_handler(void);main(int argc, char **argv){	int i=0;	int rt;	message my_msg;	ioctl_data stuff; 			memset(&stuff, 0, sizeof(ioctl_data));		if (do_init("/dev/compaq/cpqphpc") != OK) exit(1);		if( parse_args( argc, argv ) == NO_OK )		{			exit(1);		}		sigemptyset(&sact.sa_mask);		sigaddset(&sact.sa_mask, SIGIO);		sact.sa_handler = (__sighandler_t)signal_handler;		sact.sa_flags = 0;		if (sigaction(SIGIO, &sact, &osact) < 0) {			fprintf( stderr, "SIGIO signal error\n");		}		fcntl(dev_hpc, F_SETOWN, getpid());		rt = fcntl(dev_hpc, F_GETFL);		fcntl(dev_hpc, F_SETFL, rt | FASYNC);			stuff.type_of_request = cmd;	if (slot_number != ERROR_VAL) 	{		stuff.physical_slot = slot_number;	}	if (cmd == HARDWARE_TEST)	{		stuff.value = 1;	}	if (cmd == SET_ATTENTION_STATUS)	{		if (data.status)  // turn att. status on			stuff.value = 1;		else			stuff.value = 0;	}	rt = ioctl(dev_hpc, GUI_BACK_DOOR, &stuff);  // rt = 0 is success						     // rt < 0 is failure	//	printf("strike a key\n");//	while (1);//	getc(stdin);	close(dev_hpc);		return 0;}/********************************************************* do_init - Initialize the application.  *********************************************************/int do_init(char *pdev){	if ((dev_hpc = open(pdev, O_RDONLY)) == NO_OK) 	{		perror( pdev);		fprintf(stderr, "Compaq PCI Hot Plug Driver for Linux may not be installed!\n\n");		return NO_OK;	}	return OK;}/********************************************************/int parse_args(int argc, char **argv){	register int c;	extern char *optarg;	memset(&data, 0, sizeof(MSG_DATA));  // clear struct values	data.status = ERROR_VAL;  	     // initialize status variable		while((c = getopt(argc, argv, "01aehis:t")) != NO_OK) 	{		switch (c)		{		case 'a': // Set attention state on or off			{				cmd = SET_ATTENTION_STATUS;				break;			}		case 'e':  // Arm slot SERR			{				cmd = SET_SOGO;				break;			}		case 'h':  // Start hardware test 			{				cmd = HARDWARE_TEST;				break;			}		case 'i': // Turn slot on or off			{				cmd = SLOT_INIT;				break;			}		case 's':  // Set slot number			{				slot_number = atoi(optarg);				if (slot_number < 1) {					printf("Invalid slot number. The slot number must be a positive integer.\n");					return;				}				break;			}		case 't':  // Get slot status			{				cmd = GET_STATUS;				break;			}		case '0':  // disable command			{				data.status = 0;				break;			}		case '1':  // enable command			{				data.status = 1;				break;			}		default:   // Print Usage/Help Message			{				//fprintf(stderr, "Invalid command\n");				print_help('z');				return NO_OK;			}		}  // end switch 	}		if (cmd == ERROR_VAL) 	{		print_help('z');		return NO_OK;	}	else if (cmd == SLOT_INIT)	{		if (slot_number == ERROR_VAL || data.status == ERROR_VAL)		{			print_help('i');			return NO_OK;		}				if (data.status == 0)		{			cmd = POWER_DOWN_BOARD;		}		else if (data.status == 1)		{			cmd = ADD_BOARD;		}	}	else if (cmd == SET_ATTENTION_STATUS)	{		if (slot_number == ERROR_VAL || data.status == ERROR_VAL)		{			print_help('a');			return NO_OK;		}						}	else if (cmd == SET_SOGO)	{		if (slot_number == ERROR_VAL || data.status == ERROR_VAL)		{			print_help('e');			return NO_OK;		}				}	else if (cmd == GET_STATUS)	{		if (slot_number == ERROR_VAL)		{			print_help('t');			return NO_OK;		}				}	else if (cmd == HARDWARE_TEST)	{		if (slot_number == ERROR_VAL)		{			print_help('h');			exit (1);		}	}	return OK;}void signal_handler(void){	message sig_msg;	read(dev_hpc, &sig_msg, sizeof(message));		dispatch(sig_msg);}// debugging function to print out contents of message received from driverint dispatch(message sig_msg){/*		printf("Event Message = %d\n", sig_msg.EBMessageID);	printf("EBSerialNumber = %d\n", sig_msg.EBSerialNumber);	printf("Event Message = %s\n", msgMap[sig_msg.EBMessageID]);	printf("Short Data 0 = %8.8x\n", sig_msg.EBShortData[0]);	printf("Short Data 1 = %8.8x\n", sig_msg.EBShortData[1]);	printf("Short Data 2 = %8.8x\n", sig_msg.EBShortData[2]);	printf("Short Data 3 = %8.8x\n", sig_msg.EBShortData[3]);	printf("\n");		while (1);	return OK;	switch (sig_msg.EBMessageID) 	{	default:		{ 			fprintf(stderr, "Error in dispatch\n");			return OK;		}	}*/}// Display usage infovoid print_help(char msg) {	fprintf(stderr, "usage:\n ");		switch (msg)	{	case 'i':	case 'a':	case 'e':				{			fprintf(stderr, "\t-%c -s <slot number> -0/-1\n\n", msg);			break;		}	case 'h':	case 't':		{			fprintf(stderr, "\t-%c -s <slot number>\n\n", msg);			break;		}	default:		{			fprintf(stderr, "\tSlot Power on/off: -i -s <slot number> -0/-1\n");			fprintf(stderr, "\tAttention Status on/off: -a -s <slot number> -0/-1\n");			fprintf(stderr, "\tHardware Test: -h -s <slot number>\n\n");		}	} // end switch}

⌨️ 快捷键说明

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