github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/contrib/flash/spi_linux.go (about) 1 // Copyright 2021 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "fmt" 9 "math" 10 "strconv" 11 12 "github.com/mvdan/u-root-coreutils/pkg/flash" 13 "github.com/mvdan/u-root-coreutils/pkg/spidev" 14 ) 15 16 type spidevProgrammer struct { 17 *flash.Flash 18 spi *spidev.SPI 19 } 20 21 func (p *spidevProgrammer) Close() error { 22 return p.spi.Close() 23 } 24 25 func init() { 26 supportedProgrammers["linux_spi"] = func(params programmerParams) (programmer, error) { 27 dev, ok := params["dev"] 28 if !ok { 29 return nil, fmt.Errorf("dev is a required parameter for linux_spi") 30 } 31 delete(params, "dev") 32 33 spi, err := spidev.Open(dev) 34 if err != nil { 35 return nil, err 36 } 37 38 if spiSpeed, ok := params["spispeed"]; ok { 39 spiSpeedKHz, err := strconv.Atoi(spiSpeed) 40 if err != nil { 41 return nil, err 42 } 43 if spiSpeedKHz > math.MaxUint32/1000 { 44 return nil, fmt.Errorf("spispeed is larger than max uint32") 45 } 46 if err := spi.SetSpeedHz(uint32(spiSpeedKHz) * 1000); err != nil { 47 return nil, err 48 } 49 delete(params, "spispeed") 50 } 51 52 if len(params) != 0 { 53 return nil, fmt.Errorf("unrecognized parameters: %v", params) 54 } 55 f, err := flash.New(spi) 56 if err != nil { 57 return nil, err 58 } 59 return &spidevProgrammer{ 60 Flash: f, 61 spi: spi, 62 }, nil 63 } 64 }