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  }