checkpoint
[slipway.git] / src / edu / berkeley / obits / device / atmel / ChipImpl.java
1 package edu.berkeley.obits.device.atmel;
2 import com.ftdi.usb.*;
3 import java.io.*;
4
5 public class ChipImpl extends FtdiChip implements Chip {
6
7     private int dmask =
8         //(1<<0) |
9         (1<<1) |
10         (1<<2) |
11         //(1<<3) |
12         //(1<<4) |
13         (1<<5) |
14         (1<<6) |
15         (1<<7);
16
17     public ChipImpl() {
18         super();
19         doReset();
20     }
21
22     public void doReset() {
23
24         dmask =
25             (1<<0) |
26             (1<<1) |
27             (1<<2) |
28             //(1<<3) |
29             //(1<<4) |
30             (1<<5) |
31             (1<<6) |
32             (1<<7);
33
34         flush();
35         //purge();
36
37         dbangmode(dmask);
38         flush();
39
40         clk(false);
41         data(false);
42         con(false);
43         flush();
44         //try { Thread.sleep(500); } catch (Exception e) { }
45
46         reset(false);
47         flush();
48         try { Thread.sleep(500); } catch (Exception e) { }
49
50         reset(true);
51         flush();
52         try { Thread.sleep(500); } catch (Exception e) { }
53     }
54
55     int porte = 0;
56     public void porte(int pin, boolean b) {
57         porte = (~(1<<pin)) | (b ? (1<<pin) : 0);
58         if (pin==4) {
59             dbang(2, b);
60             flush();
61         }
62     }
63
64     public void config(boolean bit) { config(bit?1:0, 1); }
65     public void config(int dat) { config(dat, 8); }
66     public void config(int dat, int numbits) {
67         for(int i=(numbits-1); i>=0; i--) {
68             boolean bit = (dat & (1<<i)) != 0;
69             data(bit);
70             clk(true);
71             clk(false);
72         }
73     }
74
75     // tricky: RESET has a weak pull-up, and is wired to a CBUS line.  So,
76     //         we can pull it down (assert reset) from uart-mode, or we can
77     //         let it float upward from either mode.
78     public void reset(boolean on) {
79         bits = on ? (1<<1) : 0;
80         mask = ((1<<0) | (1<<1));
81         uart();
82         flush();
83         if (on) {
84             mask = (1<<0);
85             uart();
86             flush();
87             try { Thread.sleep(100); } catch (Exception e) { }
88             dbangmode(dmask);
89             flush();
90         }
91     }
92
93     public void avrrst(boolean on) { dbang(7, on); }
94     public void clk(boolean on)    { dbang(6, on); }
95     public void data(boolean on)   { dbang(5, on); }
96
97     public boolean initErr()       { flush(); return (readPins() & (1<<4))!=0; }
98     public boolean con() {
99         flush();
100         dmask &= ~(1<<0);
101         dbangmode(dmask);
102         return (readPins() & (1<<0)) != 0;
103     }
104     public void con(boolean on) {
105         flush();
106         dmask |= (1<<0);
107         dbangmode(dmask);
108         dbang(0, on);
109     }
110 }