📄 download.c
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h> /* needed for ioperm() */#include <sys/io.h>#include <sys/types.h>#include <sys/stat.h>#define DATA 0x378#define STATUS DATA+1#define CONTROL DATA+2int main(int argc, char *argv[]) { struct stat stat_buf; char tmpname[40]; FILE *bitfile; union { unsigned int i; unsigned short s[2]; char c[4]; } head_len; unsigned char head_key; char buf[2035464]; unsigned int i; int j; unsigned char tmp; if (argc != 2) { printf("usage: %s <bitfile>\n", argv[0]); exit(0); } sprintf(tmpname, "/var/tmp/pilchard.%d", getpid()); if (link("/var/lock/subsys/pilchard", tmpname) == -1) goto Err_link; if (stat("/var/lock/subsys/pilchard", &stat_buf) == -1) goto Err_stat; if (stat_buf.st_nlink > 2) goto Err_lock; bitfile = fopen(argv[1], "r"); if (bitfile == NULL) goto Err_file; fread(&(head_len.c[1]), 1, 1, bitfile); fread(&(head_len.c[0]), 1, 1, bitfile); fread(buf, head_len.s[0], 1, bitfile); fread(&(head_len.c[1]), 1, 1, bitfile); fread(&(head_len.c[0]), 1, 1, bitfile); head_key = 0; while (head_key != 0x65) { fread(&head_key, 1, 1, bitfile); fread(&(head_len.c[3]), 1, 1, bitfile); fread(&(head_len.c[2]), 1, 1, bitfile); if (head_key == 0x65) { fread(&(head_len.c[1]), 1, 1, bitfile); fread(&(head_len.c[0]), 1, 1, bitfile); fread(buf, head_len.i, 1, bitfile); } else { fread(buf, head_len.s[1], 1, bitfile); printf("%s\n", buf); } } fclose(bitfile); if (iopl(3)) goto Err_permission; outb(0x04, CONTROL); // sense VCC outb(0x10, DATA); tmp = inb(STATUS) & 0xA0; if (tmp != 0x80) goto Err_cable; outb(0x50, DATA); tmp = inb(STATUS) & 0xA0; if (tmp != 0x20) goto Err_cable; printf("cable detected\n"); // clear config outb(0x10, DATA); printf("configuration memory cleared\n"); outb(0x14, DATA); tmp = inb(STATUS); printf("start loading %d bytes\n", head_len.i); for (i=0; i<head_len.i; i++) { for (j=7; j>=0; j--) { tmp = (buf[i]>>j) & 1; outb(tmp|0x14, DATA); outb(tmp|0x16, DATA); } } printf("finish loading\n"); // Done tmp = inb(STATUS); tmp = (tmp>>4)&1; if (tmp) printf("DONE!\n"); else goto Err_failed; if (unlink(tmpname)) { printf("Pilchard corrupted (unlink)! Ask admin for help!\n"); exit(0); } return (0);Err_link: printf("System corrupted (link)! Ask admin for help!\n"); return(1);Err_stat: printf("System corrupted (stat)! Ask admin for help!\n"); goto final_unlink;Err_lock: printf("Pilchard locked by others! Try again later!\n"); goto final_unlink;Err_file: printf("Err: bit file not found\n"); goto final_unlink;Err_permission: printf("Err: cannot access port\n"); goto final_unlink;Err_cable: printf("Err: cable not found\n"); goto final_unlink;Err_failed: printf("Err: program failed\n"); goto final_unlink;final_unlink: if (unlink(tmpname)) printf("Pilchard corrupted (unlink)! Ask admin for help!\n"); exit(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -