Skip to content

Commit b53a8a1

Browse files
sago35deadprogram
authored andcommitted
ili9341: add standard SPI driver
1 parent 5e117c1 commit b53a8a1

File tree

3 files changed

+97
-7
lines changed

3 files changed

+97
-7
lines changed

examples/ili9341/pyportal_boing/main.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const (
2525
)
2626

2727
var (
28-
frameBuffer = [(graphics.BALLHEIGHT + 8) * (graphics.BALLWIDTH + 8)]uint16{}
28+
frameBuffer = [(graphics.BALLHEIGHT + 8) * (graphics.BALLWIDTH + 8) * 2]uint8{}
2929

3030
startTime int64
3131
frame int64
@@ -179,7 +179,8 @@ func main() {
179179
c = BGCOLOR
180180
}
181181
}
182-
frameBuffer[y*int(width)+x] = c
182+
frameBuffer[(y*int(width)+x)*2] = byte(c >> 8)
183+
frameBuffer[(y*int(width)+x)*2+1] = byte(c)
183184
bx1++ // Increment bitmap position counters (X axis)
184185
bgx1++
185186
}
@@ -190,7 +191,7 @@ func main() {
190191
bgy++
191192
}
192193

193-
display.DrawRGBBitmap(minx, miny, frameBuffer[:width*height], width, height)
194+
display.DrawRGBBitmap8(minx, miny, frameBuffer[:width*height*2], width, height)
194195

195196
// Show approximate frame rate
196197
frame++
@@ -215,11 +216,13 @@ func DrawBackground() {
215216
b = graphics.Background[j*byteWidth+k/8]
216217
}
217218
if b&0x80 == 0 {
218-
frameBuffer[k] = BGCOLOR
219+
frameBuffer[2*k] = byte(BGCOLOR >> 8)
220+
frameBuffer[2*k+1] = byte(BGCOLOR & 0xFF)
219221
} else {
220-
frameBuffer[k] = GRIDCOLOR
222+
frameBuffer[2*k] = byte(GRIDCOLOR >> 8)
223+
frameBuffer[2*k+1] = byte(GRIDCOLOR & 0xFF)
221224
}
222225
}
223-
display.DrawRGBBitmap(0, j, frameBuffer[0:w], w, 1)
226+
display.DrawRGBBitmap8(0, j, frameBuffer[0:w*2], w, 1)
224227
}
225228
}

ili9341/ili9341.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,20 @@ func (d *Device) DrawRGBBitmap(x, y int16, data []uint16, w, h int16) error {
160160
return nil
161161
}
162162

163+
// DrawRGBBitmap8 copies an RGB bitmap to the internal buffer at given coordinates
164+
func (d *Device) DrawRGBBitmap8(x, y int16, data []uint8, w, h int16) error {
165+
k, i := d.Size()
166+
if x < 0 || y < 0 || w <= 0 || h <= 0 ||
167+
x >= k || (x+w) > k || y >= i || (y+h) > i {
168+
return errors.New("rectangle coordinates outside display area")
169+
}
170+
d.setWindow(x, y, w, h)
171+
d.startWrite()
172+
d.driver.write8sl(data)
173+
d.endWrite()
174+
return nil
175+
}
176+
163177
// FillRectangle fills a rectangle at given coordinates with a color
164178
func (d *Device) FillRectangle(x, y, width, height int16, c color.RGBA) error {
165179
k, i := d.Size()
@@ -300,7 +314,9 @@ func (d *Device) sendCommand(cmd byte, data []byte) {
300314
d.dc.Low()
301315
d.driver.write8(cmd)
302316
d.dc.High()
303-
d.driver.write8sl(data)
317+
if data != nil {
318+
d.driver.write8sl(data)
319+
}
304320
d.endWrite()
305321
}
306322

ili9341/spi.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// +build !atsamd51,!atsamd21
2+
3+
package ili9341
4+
5+
import (
6+
"machine"
7+
)
8+
9+
var buf [64]byte
10+
11+
type spiDriver struct {
12+
bus machine.SPI
13+
}
14+
15+
func NewSPI(bus machine.SPI, dc, cs, rst machine.Pin) *Device {
16+
return &Device{
17+
dc: dc,
18+
cs: cs,
19+
rst: rst,
20+
rd: machine.NoPin,
21+
driver: &spiDriver{
22+
bus: bus,
23+
},
24+
}
25+
}
26+
27+
func (pd *spiDriver) configure(config *Config) {
28+
}
29+
30+
func (pd *spiDriver) write8(b byte) {
31+
buf[0] = b
32+
pd.bus.Tx(buf[:1], nil)
33+
}
34+
35+
func (pd *spiDriver) write8n(b byte, n int) {
36+
buf[0] = b
37+
for i := 0; i < n; i++ {
38+
pd.bus.Tx(buf[:1], nil)
39+
}
40+
}
41+
42+
func (pd *spiDriver) write8sl(b []byte) {
43+
pd.bus.Tx(b, nil)
44+
}
45+
46+
func (pd *spiDriver) write16(data uint16) {
47+
buf[0] = uint8(data >> 8)
48+
buf[1] = uint8(data)
49+
pd.bus.Tx(buf[:2], nil)
50+
}
51+
52+
func (pd *spiDriver) write16n(data uint16, n int) {
53+
for i := 0; i < len(buf); i += 2 {
54+
buf[i] = uint8(data >> 8)
55+
buf[i+1] = uint8(data)
56+
}
57+
58+
for i := 0; i < (n >> 5); i++ {
59+
pd.bus.Tx(buf[:], nil)
60+
}
61+
62+
pd.bus.Tx(buf[:n%64], nil)
63+
}
64+
65+
func (pd *spiDriver) write16sl(data []uint16) {
66+
for i, c := 0, len(data); i < c; i++ {
67+
buf[0] = uint8(data[i] >> 8)
68+
buf[1] = uint8(data[i])
69+
pd.bus.Tx(buf[:2], nil)
70+
}
71+
}

0 commit comments

Comments
 (0)