| 71 | | if(strcmp(argv[1], "-f")) { |
| 72 | | addrreg = strtol(argv[1],&end,0); |
| 73 | | } else { |
| 74 | | if(argc != 4) { |
| 75 | | help(); |
| 76 | | exit(1); |
| 77 | | } |
| 78 | | flat = 1; |
| 79 | | addrreg = strtol(argv[2],&end,0); |
| 80 | | } |
| 81 | | if (*end) { |
| 82 | | fprintf(stderr,"Error: Invalid address!\n"); |
| 83 | | help(); |
| 84 | | exit(1); |
| 85 | | } |
| 86 | | if ((addrreg < 0) || (addrreg > 0xffff)) { |
| 87 | | fprintf(stderr,"Error: Address out of range!\n"); |
| 88 | | help(); |
| 89 | | exit(1); |
| 90 | | } |
| | 66 | if (!strcmp(argv[1], "-f")) { |
| | 67 | flat = 1; |
| | 68 | } |
| 101 | | datareg = strtol(argv[2],&end,0); |
| 102 | | if (*end) { |
| 103 | | fprintf(stderr,"Error: Invalid data register!\n"); |
| 104 | | help(); |
| 105 | | exit(1); |
| 106 | | } |
| 107 | | if ((datareg < 0) || (datareg > 0xffff)) { |
| 108 | | fprintf(stderr,"Error: Data register out of range!\n"); |
| 109 | | help(); |
| 110 | | exit(1); |
| 111 | | } |
| | 75 | addrreg = strtol(argv[1+flat], &end, 0); |
| | 76 | if (*end) { |
| | 77 | fprintf(stderr, "Error: Invalid address!\n"); |
| | 78 | help(); |
| | 79 | exit(1); |
| | 80 | } |
| | 81 | if (addrreg < 0 || addrreg > (flat?0xffff:0x3fff)) { |
| | 82 | fprintf(stderr, |
| | 83 | "Error: Address out of range (0x0000-0x%04x)!\n", |
| | 84 | flat?0xffff:0x3fff); |
| | 85 | help(); |
| | 86 | exit(1); |
| | 87 | } |
| 113 | | if(flat) { |
| 114 | | value = strtol(argv[3],&end,0); |
| 115 | | if (*end) { |
| 116 | | fprintf(stderr,"Error: Invalid addr!\n"); |
| 117 | | help(); |
| 118 | | exit(1); |
| 119 | | } |
| 120 | | } else { |
| 121 | | addr = strtol(argv[3],&end,0); |
| 122 | | if (*end) { |
| 123 | | fprintf(stderr,"Error: Invalid addr!\n"); |
| 124 | | help(); |
| 125 | | exit(1); |
| 126 | | } |
| 127 | | value = strtol(argv[4],&end,0); |
| 128 | | if (*end) { |
| 129 | | fprintf(stderr,"Error: Invalid data!\n"); |
| 130 | | help(); |
| 131 | | exit(1); |
| 132 | | } |
| 133 | | } |
| 134 | | } |
| | 89 | if (!flat) { |
| | 90 | datareg = strtol(argv[2], &end, 0); |
| | 91 | if (*end) { |
| | 92 | fprintf(stderr, "Error: Invalid data register!\n"); |
| | 93 | help(); |
| | 94 | exit(1); |
| | 95 | } |
| | 96 | if (datareg < 0 || datareg > 0x3fff) { |
| | 97 | fprintf(stderr, "Error: Data register out of range " |
| | 98 | "(0x0000-0x3fff)!\n"); |
| | 99 | help(); |
| | 100 | exit(1); |
| | 101 | } |
| 141 | | fprintf(stderr," WARNING! Running this program can cause system crashes, " |
| 142 | | "data loss and worse!\n"); |
| 143 | | if(flat) |
| 144 | | fprintf(stderr," I will write address 0x%04x with data 0x%02x\n", |
| 145 | | addrreg, value); |
| 146 | | else |
| 147 | | fprintf(stderr," I will write chip address 0x%04x with data 0x%02x\n" |
| 148 | | " using address register 0x%04x and " |
| 149 | | "data register 0x%04x.\n", |
| 150 | | addr, value, addrreg, datareg); |
| 151 | | fprintf(stderr," You have five seconds to reconsider and press CTRL-C!\n\n"); |
| 152 | | sleep(5); |
| | 117 | value = strtol(argv[4-flat], &end, 0); |
| | 118 | if (*end) { |
| | 119 | fprintf(stderr, "Error: Invalid value!\n"); |
| | 120 | help(); |
| | 121 | exit(1); |
| | 122 | } |
| | 123 | if (value < 0 || value > 0xff) { |
| | 124 | fprintf(stderr, "Error: Value out of range " |
| | 125 | "(0x00-0xff)!\n"); |
| | 126 | help(); |
| | 127 | exit(1); |
| | 128 | } |
| | 129 | |
| | 130 | if (getuid()) { |
| | 131 | fprintf(stderr, "Error: Can only be run as root " |
| | 132 | "(or make it suid root)\n"); |
| | 133 | exit(1); |
| | 134 | } |
| | 135 | |
| | 136 | fprintf(stderr, "WARNING! Running this program can cause " |
| | 137 | "system crashes, data loss and worse!\n"); |
| | 138 | if (flat) |
| | 139 | fprintf(stderr, "I will write value 0x%02x to address " |
| | 140 | "0x%04x\n", value, addrreg); |
| | 141 | else |
| | 142 | fprintf(stderr, "I will write value 0x%02x to address " |
| | 143 | "0x%02x of chip with address register 0x%04x\n" |
| | 144 | "and data register 0x%04x.\n", |
| | 145 | value, addr, addrreg, datareg); |
| | 146 | fprintf(stderr, "You have five seconds to reconsider and press " |
| | 147 | "CTRL-C!\n\n"); |
| | 148 | sleep(5); |
| 155 | | if ((datareg < 0x400) && (addrreg < 0x400) && !flat) { |
| 156 | | if(ioperm(datareg,1,1)) { |
| 157 | | fprintf(stderr,"Error: Could not ioperm() data register!\n"); |
| 158 | | exit(1); |
| 159 | | } |
| 160 | | if(ioperm(addrreg,1,1)) { |
| 161 | | fprintf(stderr,"Error: Could not ioperm() address register!\n"); |
| 162 | | exit(1); |
| 163 | | } |
| 164 | | } else { |
| 165 | | if(iopl(3)) { |
| 166 | | fprintf(stderr,"Error: Could not do iopl(3)!\n"); |
| 167 | | exit(1); |
| 168 | | } |
| 169 | | } |
| | 151 | if (!flat && datareg < 0x400 && addrreg < 0x400) { |
| | 152 | if (ioperm(datareg, 1, 1)) { |
| | 153 | fprintf(stderr, "Error: Could not ioperm() data " |
| | 154 | "register!\n"); |
| | 155 | exit(1); |
| | 156 | } |
| | 157 | if (ioperm(addrreg, 1, 1)) { |
| | 158 | fprintf(stderr, "Error: Could not ioperm() address " |
| | 159 | "register!\n"); |
| | 160 | exit(1); |
| | 161 | } |
| | 162 | } else { |
| | 163 | if (iopl(3)) { |
| | 164 | fprintf(stderr, "Error: Could not do iopl(3)!\n"); |
| | 165 | exit(1); |
| | 166 | } |
| | 167 | } |