Files
2024-08-03 21:12:40 -04:00

171 lines
3.7 KiB
Go

package orangefork
import (
"errors"
"fmt"
"periph.io/x/conn/v3/pin/pinreg"
"strings"
"periph.io/x/conn/v3/driver/driverreg"
"periph.io/x/conn/v3/gpio"
"periph.io/x/conn/v3/pin"
"periph.io/x/host/v3/allwinner"
"periph.io/x/host/v3/distro"
)
// Present return true if a Orange Pi board is detected.
func Present() bool {
if isArm {
// This works for the Orange Pi Zero, not sure if other Orange Pi boards
// match the same DTModel prefix.
return strings.HasPrefix(distro.DTModel(), "OrangePi")
}
return false
}
var (
PC1_5 gpio.PinIO = allwinner.PC5
PC1_6 gpio.PinIO = allwinner.PC6
PC1_15 gpio.PinIO = allwinner.PC15
PC1_16 gpio.PinIO = allwinner.PC16
)
func isOrangePiZeroModel(model string) bool {
lowerModel := strings.ToLower(model)
return strings.Contains(lowerModel, "orange") &&
strings.Contains(lowerModel, "pi") &&
strings.Contains(lowerModel, "zero")
}
// registerHeaders registers the headers for various Orange Pi boards. Currently
// only Orange Pi Zero is supported.
func registerHeaders(model string) error {
// http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero.html
if isOrangePiZeroModel(model) {
fmt.Println("It is an orange pi zero!")
// 26pin expansion port
//if err := pinreg.Register("PA", [][]pin.Pin{
// {PA1_1, PA1_2},
// {PA1_3, PA1_4},
// {PA1_5, PA1_6},
// {PA1_7, PA1_8},
// {PA1_9, PA1_10},
// {PA1_11, PA1_12},
// {PA1_13, PA1_14},
// {PA1_15, PA1_16},
// {PA1_17, PA1_18},
// {PA1_19, PA1_20},
// {PA1_21, PA1_22},
// {PA1_23, PA1_24},
// {PA1_25, PA1_26},
//}); err != nil {
// return err
//}
if err := pinreg.Register("PA", [][]pin.Pin{
{PC1_5, PC1_6},
{PC1_15, PC1_16},
}); err != nil {
return err
} else {
fmt.Println("PA pins registered")
}
// 13pin function interface
//if err := pinreg.Register("FUN", [][]pin.Pin{
// {FUN1_1},
// {FUN1_2},
// {FUN1_3},
// {FUN1_4},
// {FUN1_5},
// {FUN1_6},
// {FUN1_7},
// {FUN1_8},
// {FUN1_9},
// {FUN1_10},
// {FUN1_11},
// {FUN1_12},
// {FUN1_13},
//}); err != nil {
// return err
//}
} else {
fmt.Println("Sad panda")
}
return nil
}
// driver implements periph.Driver.
type driver struct {
}
// String is the text representation of the board.
func (d *driver) String() string {
return "fork-orangepi"
}
// Prerequisites load drivers before the actual driver is loaded. For
// these boards, we do not need any prerequisites.
func (d *driver) Prerequisites() []string {
return nil
}
// After this driver is loaded, we need to load generic Allwinner drivers
// for the GPIO pins which are identical on all Allwinner CPUs.
func (d *driver) After() []string {
return []string{"allwinner-gpio", "allwinner-gpio-pl"}
}
// Init initializes the driver by checking its presence and if found, the
// driver will be registered.
func (d *driver) Init() (bool, error) {
if !Present() {
return false, errors.New("borad Orange Pi not detected")
}
model := distro.DTModel()
if model == "<unknown>" {
return true, fmt.Errorf("orangepi: failed to obtain model")
}
fmt.Printf("The model is %s \n", model)
err := registerHeaders(model)
if err != nil {
fmt.Printf("%s\n\n", err)
} else {
fmt.Println("Not problems")
}
return true, err
}
// init register the driver.
func init() {
printshit()
if isArm {
driverreg.MustRegister(&drv)
} else {
fmt.Println("Is not arm, cannot load orange fork")
}
}
func printshit() {
fmt.Println("======================================")
fmt.Println("Printing shit")
for _, c := range distro.DTCompatible() {
fmt.Println(c)
}
if allwinner.IsH5() {
fmt.Println("is h5")
} else if allwinner.IsH3() {
fmt.Println("is h3")
} else {
fmt.Println("is nothing")
}
}
var drv driver