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 == "" { 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