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

📄 download.c

📁 可重构加速部件
💻 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 + -