package mt12232a import ( "fmt" "io" "log" "time" "gitea.unprism.ru/yotia/display-test/pkg/parallel8bit" "github.com/stianeikeland/go-rpio/v4" ) type mt12232a struct { logger *log.Logger dev parallel8bit.Device pinCS rpio.Pin pinRES rpio.Pin } type Device interface { PowerOn() error WriteCodeL(c byte) error WriteCodeR(c byte) error WriteDataL(b byte) error WriteDataR(b byte) error WriteDatasL(b []byte) error WriteDatasR(b []byte) error ReadDataL() (byte, error) ReadDataR() (byte, error) ReadStatus(cs rpio.State) byte io.Closer } func New(logger *log.Logger) (Device, error) { rpio.Open() d := mt12232a{ logger: logger, dev: parallel8bit.New(logger, parallel8bit.DevicePins{ PinA0: rpio.Pin(19), PinRW: rpio.Pin(13), PinE: rpio.Pin(12), PinDB0: rpio.Pin(22), PinDB1: rpio.Pin(10), PinDB2: rpio.Pin(9), PinDB3: rpio.Pin(11), PinDB4: rpio.Pin(21), PinDB5: rpio.Pin(20), PinDB6: rpio.Pin(26), PinDB7: rpio.Pin(16), }), pinCS: rpio.Pin(17), pinRES: rpio.Pin(27), } d.pinCS.Output() d.pinRES.Output() d.dev.Reset() return &d, nil } func (d *mt12232a) Close() error { return rpio.Close() } func (d *mt12232a) status() { d.logger.Println("STATUS:", d.ReadStatus(0)&0xF0, d.ReadStatus(1)&0xF0) } func (d *mt12232a) PowerOn() error { d.status() d.logger.Println(d.ReadStatus(0)) // Should be 0 d.logger.Println("Reset") d.status() d.pinRES.Low() time.Sleep(time.Microsecond) d.logger.Println(d.ReadStatus(0)) // Should be 48 (power off and reset) d.pinRES.High() time.Sleep(4 * time.Millisecond) d.logger.Println(d.ReadStatus(0)) // Should be 32 (power off) // Module is reset and should be turned off if d.ReadStatus(0) == 0 || d.ReadStatus(1) == 0 { return fmt.Errorf("no response from display(or it is possible that it is turned on but...)") } for i := 0; i < 100; i++ { if ((d.ReadStatus(0) >> 4) & 1) == 0 { break } } d.status() d.status() d.status() d.logger.Println("Power on") d.status() d.WriteCodeL(0xE2) // Reset d.WriteCodeR(0xE2) // Reset d.WriteCodeL(0xEE) // ReadModifyWrite off d.WriteCodeR(0xEE) // ReadModifyWrite off d.WriteCodeL(0xA4) // Turn on common mode d.WriteCodeR(0xA4) // Turn on common mode d.WriteCodeL(0xA9) // Multiplex 1/32 d.WriteCodeR(0xA9) // Multiplex 1/32 d.WriteCodeL(0xC0) // Top line to 0 d.WriteCodeR(0xC0) // Top line to 0 d.WriteCodeL(0xA1) // Invert scan RAM d.WriteCodeR(0xA0) // NonInvert scan RAM d.status() d.logger.Println("Display on") d.WriteCodeL(0xAF) // Display on d.WriteCodeR(0xAF) // Display on d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) d.status() time.Sleep(100 * time.Millisecond) // Check that crystals are turned on if ((d.ReadStatus(0) >> 5) & 1) == 1 { d.logger.Println("Left cristal is still off") } if ((d.ReadStatus(0) >> 5) & 1) == 1 { d.logger.Println("Right cristal is still off") } // The same but with error if ((d.ReadStatus(0) >> 5) & 1) == 1 { return fmt.Errorf("Left cristal is still off") } if ((d.ReadStatus(0) >> 5) & 1) == 1 { return fmt.Errorf("Right cristal is still off") } return nil } // Write codes func (d *mt12232a) WriteCodeL(c byte) error { return d.writeByte(c, 0, 0) } func (d *mt12232a) WriteCodeR(c byte) error { return d.writeByte(c, 0, 1) } // Write data as byte func (d *mt12232a) WriteDataL(b byte) error { return d.writeByte(b, 1, 0) } func (d *mt12232a) WriteDataR(b byte) error { return d.writeByte(b, 1, 1) } func (d *mt12232a) WriteDatasL(b []byte) error { return d.writeBytes(b, 1, 0) } func (d *mt12232a) WriteDatasR(b []byte) error { return d.writeBytes(b, 1, 1) } // Read data func (d *mt12232a) ReadDataL() (byte, error) { return d.readByte(1, 0) } func (d *mt12232a) ReadDataR() (byte, error) { return d.readByte(1, 1) } // Low level functions func (d *mt12232a) writeByte(b byte, cd, cs rpio.State) error { if err := d.waitReady(cs); err != nil { return fmt.Errorf("wait ready: %w", err) } d.pinCS.Write(cs) // Select cristals d.dev.WriteByte(b, cd) return nil } func (d *mt12232a) writeBytes(b []byte, cd, cs rpio.State) error { if err := d.waitReady(cs); err != nil { return fmt.Errorf("wait ready: %w", err) } d.pinCS.Write(cs) // Select cristals d.dev.WriteBytes(b, cd) return nil } func (d *mt12232a) readByte(cd, cs rpio.State) (byte, error) { // Setup if err := d.waitReady(cs); err != nil { return 0, fmt.Errorf("wait ready: %w", err) } d.pinCS.Write(cs) // Select cristals return d.dev.ReadByte(cd), nil } // Wait, checking status byte func (d *mt12232a) waitReady(cs rpio.State) error { d.pinCS.Write(cs) // Select cristals return d.dev.WaitReady() } func (d *mt12232a) ReadStatus(cs rpio.State) byte { d.pinCS.Write(cs) // Select cristals return d.dev.ReadByte(1) }