📄 iotest.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 + -