171 lines
3.7 KiB
Go
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
|