OSDN Git Service

* public snapshot of sid simulator
[pf3gnuchains/pf3gnuchains3x.git] / sid / component / lcd / testsuite / lcdcontroller.tk
1 # Global Variables
2 set NUM_OPLINES 9
3 set lcdinit_done 0 
4 set lcdbus_access 0
5 set ack_access 0
6 set STATUS_CRW 3
7 set LCD_STATUSREG 0xa0004
8 set LCD_CMDREG 0xa0004
9 set LCD_DATAREG 0xa0000
10 set STATUS_AUTOW 8
11
12 # 9 pins. 8 for data pins 0-7, and 1 for strobe pin
13 for { set j 0 } { $j < $NUM_OPLINES } {incr j} {
14         set lcd_ippin($j) [sid::pin::new]
15 }
16
17 # array to store pin values. Represent ASCII characters
18 for { set j 0 } { $j < [expr $NUM_OPLINES - 1] } { incr j } {
19         set val_arr($j) 0
20 }
21
22 #get pin
23 proc find_pin {name} {
24         global lcd_ippin
25         if { [string compare $name "pin0_lcdcontr"] == 0 } { return $lcd_ippin(0) }
26         if { [string compare $name "pin1_lcdcontr"] == 0 } { return $lcd_ippin(1) }
27         if { [string compare $name "pin2_lcdcontr"] == 0 } { return $lcd_ippin(2) }
28         if { [string compare $name "pin3_lcdcontr"] == 0 } { return $lcd_ippin(3) }
29         if { [string compare $name "pin4_lcdcontr"] == 0 } { return $lcd_ippin(4) }
30         if { [string compare $name "pin5_lcdcontr"] == 0 } { return $lcd_ippin(5) }
31         if { [string compare $name "pin6_lcdcontr"] == 0 } { return $lcd_ippin(6) }
32         if { [string compare $name "pin7_lcdcontr"] == 0 } { return $lcd_ippin(7) }
33         if { [string compare $name "pin8_lcdcontr"] == 0 } { return $lcd_ippin(8) }
34         return ""
35 }
36
37 # driven method for 8 data pins and one strobe pin
38 proc driven_h4 { pin value } {
39         global lcd_ippin ack_access val_arr
40         global NUM_OPLINES
41         if { [string compare $pin $lcd_ippin(8)] == 0} { 
42            if { $value == 0} {
43 #            #strobe signal is low thus data is ready
44               send_lcddata
45               sid::pin::driven_h4 $ack_access 0
46             }
47         } else {
48             for { set i 0} { $i < [expr $NUM_OPLINES - 1] } { incr i } {
49                if { [string compare $pin $lcd_ippin($i)] == 0 } { 
50                    set val_arr($i) $value
51                    break
52                   }
53                }
54         }
55 }
56
57 # connect bus with mapper
58 proc connect_accessor {name bus} {
59   global lcdbus_access
60   if { [string compare $name "input_lcdbus"] == 0} {
61     set lcdbus_access $bus
62     return "ok"
63     } else {
64         puts " Bus name doesn't match "
65         return "not_found"
66     }
67 }
68
69 proc connect_pin {name pin} {
70   global ack_access
71   if { [string compare $name "outputack"] == 0 } {
72         set ack_access $pin
73         return "ok"
74   } else {
75         puts " ack pin name not found "
76         return "not_found"
77   }
78 }
79
80 proc send_lcddata {} {
81         global lcdinit_done lcdbus_access NUM_OPLINES
82         global LCD_CMDREG LCD_STATUSREG LCD_DATAREG STATUS_CRW
83         global val_arr STATUS_AUTOW
84         set res 0
85
86 # reading input array for finding ascii value
87         for { set k 0 } { $k < [expr $NUM_OPLINES - 1] } {incr k} {
88             if { $val_arr($k) > 0 } {           
89                 set res [expr $res + [expr int([expr pow(2,$k)])]]
90              }
91         }
92 # subtract 32 from ascii value to make it lcd equivalent char.
93         set res [expr $res - 32] 
94
95         if { $lcdinit_done == 0 } {
96 # lcd hasn't initialized
97             puts " Needs Initilization "
98             Initialize_lcd
99             reset_addptr
100 # need to think about clearing memory area 
101 # number of rows will always be 16.
102         }
103
104 # send and display data 
105 # currently, I am going with write byte, move pointer ahead
106 # need to talk with R. Unrau
107          check_status $STATUS_CRW
108          sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG $res
109          check_status $STATUS_CRW
110          sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0xC0
111 # how long we will move this pointer once hit the end bring back.
112 }
113
114 #setting address ptr to text home address
115 proc reset_addptr {} {
116   global lcdbus_access STATUS_CRW LCD_DATAREG LCD_CMDREG
117   check_status $STATUS_CRW
118   sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0
119   check_status $STATUS_CRW
120   sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0
121   check_status $STATUS_CRW
122   sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x24
123 }
124
125 #initialize lcd
126 proc Initialize_lcd {} {
127    global lcdbus_access
128    global lcdinit_done LCD_STATUSREG LCD_CMDREG LCD_DATAREG
129    global STATUS_CRW
130    set lcdinit_done 1
131    
132 # setting text home address at top 0x0000
133
134    check_status $STATUS_CRW
135 # writing lower byte 0x00
136    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
137    check_status $STATUS_CRW
138 #writing higher byte 0x00
139    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
140    check_status $STATUS_CRW
141 # writing command 0x40
142    sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x40
143
144 # Setting text area set 0x0020
145
146    check_status $STATUS_CRW
147 # writing lower byte 0x14  20 columns
148    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x14
149    check_status $STATUS_CRW
150 # writing higher byte 00
151    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
152    check_status $STATUS_CRW
153 # wrting command 0x41
154    sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x41
155
156 # setting graphic home address 0x0200
157
158   check_status $STATUS_CRW
159 # data 00
160    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
161   check_status $STATUS_CRW
162 #data 02
163    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x02
164 #status 
165    check_status $STATUS_CRW
166 # command 0x42
167    sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x42    
168
169
170 # Setting graphic area set 0014
171
172   check_status $STATUS_CRW
173 # lower byte data 0x20 
174    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x14
175    check_status $STATUS_CRW
176 # higher byte 0x00
177    sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
178    check_status $STATUS_CRW
179 # command 0x43
180    sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x43
181
182 # set OR mode
183
184    check_status $STATUS_CRW
185 #command 80
186    sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x80
187
188 # display mode text, graphic, and cursor off
189
190   check_status $STATUS_CRW
191 # command 0x9C 
192    sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x9C
193
194    puts " Initilialization routine completed "
195 }
196
197
198 # check status register bits 0 & 1
199 proc check_status {stat_val} {
200   global lcdbus_access LCD_STATUSREG
201   set stat [sid::bus::read_h4_b1 $lcdbus_access $LCD_STATUSREG]
202   if { [lindex $stat 0] == "ok" } {
203       if { [expr [lindex $stat 1] & $stat_val] != $stat_val }  {
204          puts " Error status NOE $stat_val"
205     } 
206    } else { puts "Error Init not ok" }
207 }