#include "defs.h" void set_ptrs() { eprom = (unsigned short *)0x00000000; sram = (unsigned short *)0x00002000; eeprom = (unsigned short *)0x00004000; eeprom_fans = (unsigned short *)0x00004000; eeprom_temps = (unsigned short *)0x00005000; ad = (unsigned short *)0x00006000; vippor = (unsigned short *)0x00008000; lcd = (unsigned short *)0x0000A001; lcd_reg = (unsigned short *)0x0000A000; adstart = (unsigned short *)0x0000C000; } void memset(void *pointer, char chr, unsigned long length) { unsigned long i; for(i = 0;i < length;i++) *(((char *) pointer) + i) = chr; } /* ---------------- INIT_EVERYTHING ------------------ */ void init_everything() { int i; /* Läs in alla värden på allting från eeprom */ for (i = 0; i < 8; i++) { read_fan(i); read_temp(i); } /* memset(fans, 0, sizeof(fan)*8); memset(temps, 0, sizeof(temp)*8); */ #ifdef JERKER fans[0].status |= FAN_CONNECTED; /* HDD */ fans[1].status |= FAN_CONNECTED; /* CPU */ fans[2].status |= FAN_CONNECTED; /* Låda */ temps[0].status |= TEMP_CONNECTED; /* CPU */ temps[1].status |= TEMP_CONNECTED; /* HDD */ /* CPU beror på CPUfläkt och Lådfläkt */ temps[0].fan_dep[1] = 100; temps[0].fan_dep[2] = 50; temps[0].min_value = 40; temps[0].max_value = 80; /* HDD beror på HDDfläkt och Lådfläkt */ temps[1].fan_dep[0] = 100; temps[1].fan_dep[2] = 67; temps[1].min_value = 20; temps[1].max_value = 180; temps[0].curr_value = 0; temps[1].curr_value = 0; fans[0].curr_speed = 0; fans[1].curr_speed = 0; fans[2].curr_speed = 0; for (i = 0; i < 8; i++) { write_fan(i); write_temp(i); } #endif } /*--------------------------------------------- * Initiate LCD, this can only be done once... *---------------------------------------------*/ void lcd_init() { *lcd_reg = 0x38; /* Function set (8 bit, 2 rows) */ while(lcd_busy()); *lcd_reg = 0x0D; /* Display ON */ while(lcd_busy()); *lcd_reg = 0x06; /* Function set, increment, display shift off */ while(lcd_busy()); *lcd_reg = 0x01; /* Clear display */ while(lcd_busy()); *lcd_reg = 0x02; /* Return home */ while(lcd_busy()); lcd_write_cool("LCD Initiated!", 14); *lcd_reg = 0x02; /* Return home */ } void lcd_write(char *msg, unsigned short len) { unsigned short i; for (i = 0; i < len; i++) { while(lcd_busy()); *lcd = msg[i]; } } void lcd_write_cool(char *msg, unsigned short len) { unsigned short i; for (i = 0; i < len; i++) { while(lcd_busy()); *lcd = msg[i]; wait_millisec(23); } } /* void lcd_puthex(char ch, unsigned short pos) { unsigned short lo, hi; lo = 0x0F & ch; hi = (0xF0 & ch) >> 4; if (hi > 9) lcd_putchar('A' + (hi - 10), pos); else lcd_putchar('0' + hi, pos); if (lo > 9) lcd_putchar('A' + (lo - 10), pos + 1); else lcd_putchar('0' + lo, pos + 1); } */ void lcd_putdec_here(char ch) { unsigned short lo, hi, ca; ca = ch / 100; hi = ch % 100; lo = ch % 10; if (ca) lcd_putchar_here('0' + ca); lcd_putchar_here('0' + (hi / 10)); lcd_putchar_here('0' + lo); } void lcd_putdec(char ch, unsigned short pos) { unsigned short lo, hi, ca; ca = ch / 100; hi = ch % 100; lo = ch % 10; if (ca) lcd_putchar('0' + ca, pos++); else lcd_putchar(' ', pos++); lcd_putchar('0' + (hi / 10), pos++); lcd_putchar('0' + lo, pos++); } /* 0x00 - 0x27 (0-39) for first row * 0x40 - 0x67 (64-103) for second row */ void lcd_putchar_here(char ch) { while(lcd_busy()); *lcd = ch; } void lcd_putchar(char ch, unsigned short pos) { char oldpos; while(lcd_busy()); oldpos = *lcd_reg; oldpos &= 0x7F; /* DD RAM Address set */ *lcd_reg = (0x80 | (0x7F & pos)); while(lcd_busy()); *lcd = ch; while(lcd_busy()); *lcd_reg = (0x80 | oldpos); } /* char lcd_getchar(unsigned short pos) { char oldchar; char oldpos; while(lcd_busy()); oldpos = *lcd_reg; oldpos &= 0x7F; */ /* DD RAM Address set */ /* *lcd_reg = (0x80 | (0x7F & pos)); while(lcd_busy()); oldchar = *lcd; while(lcd_busy()); *lcd_reg = (0x80 | oldpos); return oldchar; } void lcd_shift(unsigned short right) { if (right) *lcd_reg = 0x1C; else *lcd_reg = 0x18; } */ unsigned short lcd_busy() { unsigned short ac_and_bf; ac_and_bf = *lcd_reg; return ac_and_bf & 0x80; } void lcd_setpos(unsigned short pos) { while(lcd_busy()); *lcd_reg = (0x80 | (0x7F & pos)); } void lcd_clear() { while(lcd_busy()); *lcd_reg = 0x01; /* Clear display */ } void eeprom_write(unsigned short val, unsigned short *pos) { unsigned short tmp; do { *pos = val; *pos = val; *pos = val; *pos = val; *pos = val; *pos = val; tmp = eeprom_read(pos); } while(tmp != val); } unsigned short eeprom_read(unsigned short *pos) { unsigned short old, tmp; do { tmp = *pos; tmp = *pos; tmp = *pos; tmp = *pos; old = tmp; tmp = *pos; tmp = *pos; tmp = *pos; tmp = *pos; } while (old != tmp); return tmp; } void read_fan(unsigned short nr) { unsigned short *base_addr; base_addr = eeprom_fans + nr; /* lcd_clear(); lcd_write_cool("EEPROM reading:", 15); lcd_setpos(64); lcd_write("fans[", 5); lcd_putdec_here(nr); lcd_write("]", 1); */ fans[nr].status = eeprom_read(base_addr); wait_millisec(EEPROM_WAIT_TIME); } void write_fan(unsigned short nr) { unsigned short *base_addr; base_addr = eeprom_fans + nr; /* lcd_clear(); lcd_write_cool("EEPROM writing:", 15); lcd_setpos(64); lcd_write("fans[", 5); lcd_putdec_here(nr); lcd_write("]", 1); */ eeprom_write(fans[nr].status, base_addr); } void read_temp(unsigned short nr) { unsigned short t, *base_addr; base_addr = eeprom_temps + sizeof(temp) * nr; /* lcd_clear(); lcd_write_cool("EEPROM reading:", 15); lcd_setpos(64); lcd_write_cool("t[", 2); lcd_putdec_here(nr); lcd_write("]", 1); */ temps[nr].status = eeprom_read(base_addr++); /* lcd_write(".", 1);*/ temps[nr].min_value = eeprom_read(base_addr++); /* lcd_write(".", 1);*/ temps[nr].max_value = eeprom_read(base_addr++); /* lcd_write(".", 1);*/ for (t = 0; t < 8; t++) { temps[nr].fan_dep[t] = eeprom_read(base_addr++); /* lcd_write(".", 1);*/ } /* lcd_setpos(72); lcd_write(".Done!", 6);*/ } void write_temp(unsigned short nr) { unsigned short t, *base_addr; base_addr = eeprom_temps + sizeof(temp) * nr; /* lcd_clear(); lcd_write_cool("EEPROM writing:", 15); lcd_setpos(64); lcd_write_cool("t[", 2); lcd_putdec_here(nr); lcd_write("]", 1); */ eeprom_write(temps[nr].status, base_addr++); /* lcd_write(".", 1);*/ eeprom_write(temps[nr].min_value, base_addr++); /* lcd_write(".", 1);*/ eeprom_write(temps[nr].max_value, base_addr++); /* lcd_write(".", 1);*/ for (t = 0; t < 8; t++) { eeprom_write(temps[nr].fan_dep[t], base_addr++); /* lcd_write(".", 1);*/ } /* lcd_setpos(72); lcd_write(".Done!", 6);*/ } /******************** CALC_TEMPS ********************/ void calc_temps() { unsigned short i, j; for(i = 0; i < 8; i = i + 1) { fans[i].curr_speed = 0; lcd_putdec(i, 14); } for(i = 0;i < 8;i++) { if(temps[i].status & TEMP_CONNECTED) { for(j = 0;j < 8;j++) { if((fans[j].status & FAN_CONNECTED) && (temps[i].curr_value > temps[i].min_value) && (temps[i].fan_dep[j])) { unsigned int heat; if (temps[i].curr_value >= temps[i].max_value) heat = 255; else { heat = (temps[i].curr_value - temps[i].min_value); heat *= temps[i].fan_dep[j]; heat /= (temps[i].max_value - temps[i].min_value); heat *= 255; heat /= 100; } /* heat += (heat << 1); */ if(heat > fans[j].curr_speed) fans[j].curr_speed = heat; } } } } } /******************** STEP *********************/ unsigned short step() { unsigned short i; unsigned short hw_fans = 0x0; for(i = 0;i < 8;i++) { if(fans[i].status & FAN_CONNECTED) { if(fans[i].curr_speed > step_counter) hw_fans |= (1 << i); } } step_counter++; return hw_fans; } /*-------------------------------------------------------------------- * Interrupt program, called from __exp4 when all registers are saved. *--------------------------------------------------------------------*/ exp4() { char val; val = *ad; temps[current_ad].curr_value = val; /* Hack.. */ /* switch(current_ad) { case 1: lcd_putdec(val, 73); break; default: lcd_putdec(val, 77); } */ calc_temps(); show_fans(); return 0; } void show_tmps() { lcd_setpos(0); lcd_write("tmp: ", 5); lcd_putdec_here(temps[1].curr_value); lcd_write(" ", 1); lcd_putdec_here(temps[0].curr_value); /* hack */ lcd_write(" ",10); lcd_putchar('(', 13); if (current_ad) lcd_putchar('1', 14); else lcd_putchar('0', 14); lcd_putchar(')', 15); } void show_fans() { lcd_setpos(64); lcd_write("Fns: ", 5); lcd_putdec_here(fans[2].curr_speed); lcd_write(" ", 1); lcd_putdec_here(fans[1].curr_speed); lcd_write(" ", 1); lcd_putdec_here(fans[0].curr_speed); /* hack */ lcd_write(" ",10); } /*----------------------- * 1 msec is approx. 430 *-----------------------*/ void wait(unsigned long time) { while(time--); } void wait_millisec(unsigned long time) { unsigned long total = (time << 8) + (time << 7) + (time << 6); /*unsigned short total = time;*/ while(total--); } int main() { unsigned int dax = 0x0FFF; set_ptrs(); current_ad = 0; *vippor = 0xFF; _avben(); lcd_init(); init_everything(); lcd_clear(); lcd_write_cool("Let's...........", 16); lcd_setpos(64); lcd_write_cool("...........Rock! ", 17); for(;;) { *vippor = step(); if (!dax--) { *(adstart + current_ad) = 1; dax = 0x0FFF; current_ad++; if (current_ad >= AD_NRCONNECTED) current_ad = 0; show_tmps(); } } return 0; }