Skip to content
This repository was archived by the owner on Dec 24, 2024. It is now read-only.

Commit 004841e

Browse files
committed
rpi: import RPi TDAQ server
1 parent 476c0e7 commit 004841e

File tree

11 files changed

+1399
-9
lines changed

11 files changed

+1399
-9
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444
if: matrix.platform == 'ubuntu-latest'
4545
run: |
4646
sudo apt-get update
47-
sudo apt-get install -qq pkg-config gcc-arm-linux-gnueabihf
47+
sudo apt-get install -qq pkg-config gcc-arm-linux-gnueabihf libftdi1-dev
4848
4949
- name: Build-Linux-32b-arm
5050
if: matrix.platform == 'ubuntu-latest'

.github/workflows/lint.yml

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ jobs:
1212
runs-on: ubuntu-latest
1313
steps:
1414
- uses: actions/checkout@v2
15+
- name: cgo-deps
16+
run: sudo apt install pkg-config libftdi1-dev
1517
- name: golangci-lint
1618
uses: golangci/golangci-lint-action@v2
1719
with:

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/go-sql-driver/mysql v1.6.0
88
github.com/peterh/liner v1.2.1
99
github.com/sbinet/pmon v0.4.1
10+
github.com/ziutek/ftdi v0.0.1
1011
go-hep.org/x/hep v0.28.5
1112
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
1213
golang.org/x/sys v0.0.0-20210510120138-977fb7262007

go.sum

+4-8
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
9999
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
100100
github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
101101
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
102-
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
103-
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
104102
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
105103
github.com/peterh/liner v1.2.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
106104
github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg=
@@ -136,6 +134,9 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW
136134
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
137135
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
138136
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
137+
github.com/ziutek/ftdi v0.0.1 h1:IrFtqLisIzEfgSnuLg1suZYLkn227DTyE464XswAGK4=
138+
github.com/ziutek/ftdi v0.0.1/go.mod h1:fUzQhjslJJSlwoMW5Cd+0RUc8KuMDfsuZB+wfJAz1eg=
139+
github.com/ziutek/lcd v0.0.0-20141212131202-924f223d0903/go.mod h1:ZBCPhfHIcCtzsrXIcyEiSPDKHrjT9fXtJNKj2t1HCKw=
139140
go-hep.org/x/hep v0.28.5 h1:ZgDxInAFlATwXYnH/KcKA1GUOrviWNMxDbO9Uz9/w5o=
140141
go-hep.org/x/hep v0.28.5/go.mod h1:jOq3IFZiwXq8zg1vhVaTkGJTzVgaL31p7570CGqFrRc=
141142
go.nanomsg.org/mangos/v3 v3.2.1 h1:/7pG6tUJO5ZGznG+waoMy6WrurArODDRJu18848oQnw=
@@ -156,7 +157,6 @@ golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL
156157
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
157158
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
158159
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
159-
golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
160160
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
161161
golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
162162
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
@@ -260,14 +260,12 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T
260260
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
261261
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
262262
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
263-
gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
264263
gonum.org/v1/gonum v0.8.1/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
265264
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
266265
gonum.org/v1/gonum v0.9.1 h1:HCWmqqNoELL0RAQeKBXWtkp04mGk8koafcB4He6+uhc=
267266
gonum.org/v1/gonum v0.9.1/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
267+
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc=
268268
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
269-
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e h1:jRyg0XfpwWlhEV8mDfdNGBeSJM2fuyh9Yjrnd8kF2Ts=
270-
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
271269
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
272270
gonum.org/v1/plot v0.8.1/go.mod h1:3GH8dTfoceRTELDnv+4HNwbvM/eMfdDUGHFG2bo3NeE=
273271
gonum.org/v1/plot v0.9.0 h1:3sEo36Uopv1/SA/dMFFaxXoL5XyikJ9Sf2Vll/k6+2E=
@@ -311,7 +309,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
311309
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
312310
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
313311
modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg=
314-
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
315312
modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8=
316313
modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw=
317314
modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8=
@@ -322,6 +319,5 @@ modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03
322319
modernc.org/ql v1.2.1/go.mod h1:Z4OwhNelDsM/MGA086C01CnjegNcHZ7gLXU9zZwsRBg=
323320
modernc.org/sortutil v1.0.0/go.mod h1:1QO0q8IlIlmjBIwm6t/7sof874+xCfZouyqZMLIAtxM=
324321
modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
325-
modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
326322
modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4=
327323
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

rpi/const.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2020 The go-lpc 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 rpi
6+
7+
const (
8+
MaxEventSize = (hardrocV2SLCFrameSize+1)*MaxNumASICs + (20*ASICMemDepth+2)*MaxNumASICs + 3 + MaxFwHeaderSize + 2 + MaxAnalogDataSize + 50
9+
10+
MaxAnalogDataSize = 1024*64*2 + 20
11+
MaxFwHeaderSize = 50
12+
MaxNumASICs = 48 // max number of hardrocs per dif that the system can handle
13+
MaxNumDIFs = 200 // max number of difs that the system can handle
14+
ASICMemDepth = 128 // memory depth of one asic . 128 is for hardroc v1
15+
16+
hardrocV2SLCFrameSize = 109
17+
microrocSLCFrameSize = 74
18+
)

rpi/device.go

+257
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
// Copyright 2020 The go-lpc 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 rpi
6+
7+
import (
8+
"encoding/binary"
9+
"fmt"
10+
"io"
11+
12+
"github.com/ziutek/ftdi"
13+
)
14+
15+
type ftdiDevice interface {
16+
Reset() error
17+
18+
SetBitmode(iomask byte, mode ftdi.Mode) error
19+
SetFlowControl(flowctrl ftdi.FlowCtrl) error
20+
SetLatencyTimer(lt int) error
21+
SetWriteChunkSize(cs int) error
22+
SetReadChunkSize(cs int) error
23+
PurgeBuffers() error
24+
25+
io.Writer
26+
io.Reader
27+
io.Closer
28+
}
29+
30+
type device struct {
31+
vid uint16 // vendor ID
32+
pid uint16 // product ID
33+
ft ftdiDevice // handle to the FTDI device
34+
}
35+
36+
var (
37+
ftdiOpen = ftdiOpenImpl
38+
)
39+
40+
func ftdiOpenImpl(vid, pid uint16) (ftdiDevice, error) {
41+
dev, err := ftdi.OpenFirst(int(vid), int(pid), ftdi.ChannelAny)
42+
return dev, err
43+
}
44+
45+
func newDevice(vid, pid uint16) (*device, error) {
46+
ft, err := ftdiOpen(vid, pid)
47+
if err != nil {
48+
return nil, fmt.Errorf("could not open FTDI device (vid=0x%x, pid=0x%x): %w", vid, pid, err)
49+
}
50+
51+
dev := &device{vid: vid, pid: pid, ft: ft}
52+
err = dev.init()
53+
if err != nil {
54+
ft.Close()
55+
return nil, fmt.Errorf("could not initialize FTDI device (vid=0x%x, pid=0x%x): %w", vid, pid, err)
56+
}
57+
58+
return dev, nil
59+
}
60+
61+
func (dev *device) init() error {
62+
var err error
63+
64+
err = dev.ft.Reset()
65+
if err != nil {
66+
return fmt.Errorf("could not reset USB: %w", err)
67+
}
68+
69+
err = dev.ft.SetBitmode(0, ftdi.ModeBitbang)
70+
if err != nil {
71+
return fmt.Errorf("could not disable bitbang: %w", err)
72+
}
73+
74+
err = dev.ft.SetFlowControl(ftdi.FlowCtrlDisable)
75+
if err != nil {
76+
return fmt.Errorf("could not disable flow control: %w", err)
77+
}
78+
79+
err = dev.ft.SetLatencyTimer(2)
80+
if err != nil {
81+
return fmt.Errorf("could not set latency timer to 2: %w", err)
82+
}
83+
84+
err = dev.ft.SetWriteChunkSize(0xffff)
85+
if err != nil {
86+
return fmt.Errorf("could not set write chunk-size to 0xffff: %w", err)
87+
}
88+
89+
err = dev.ft.SetReadChunkSize(0xffff)
90+
if err != nil {
91+
return fmt.Errorf("could not set read chunk-size to 0xffff: %w", err)
92+
}
93+
94+
if dev.pid == 0x6014 {
95+
err = dev.ft.SetBitmode(0, ftdi.ModeReset)
96+
if err != nil {
97+
return fmt.Errorf("could not reset bit mode: %w", err)
98+
}
99+
}
100+
101+
err = dev.ft.PurgeBuffers()
102+
if err != nil {
103+
return fmt.Errorf("could not purge USB buffers: %w", err)
104+
}
105+
106+
return err
107+
}
108+
109+
func (dev *device) close() error {
110+
return dev.ft.Close()
111+
}
112+
113+
func (dev *device) usbRegRead(addr uint32) (uint32, error) {
114+
a := (addr | 0x4000) & 0x7fff
115+
p := []byte{uint8(a>>8) & 0xff, uint8(a>>0) & 0xff, 0, 0}
116+
117+
n, err := dev.ft.Write(p[:2])
118+
switch {
119+
case err != nil:
120+
return 0, fmt.Errorf("could not write USB addr 0x%x: %w", addr, err)
121+
case n != len(p[:2]):
122+
return 0, fmt.Errorf("could not write USB addr 0x%x: %w", addr, io.ErrShortWrite)
123+
}
124+
125+
_, err = io.ReadFull(dev.ft, p)
126+
if err != nil {
127+
return 0, fmt.Errorf("could not read register 0x%x: %w", addr, err)
128+
}
129+
130+
v := binary.BigEndian.Uint32(p)
131+
return v, nil
132+
}
133+
134+
func (dev *device) usbCmdWrite(cmd uint32) error {
135+
addr := cmd | 0x8000 // keep only 14 LSB, write, so bit 14=0,register mode, so bit 15=0
136+
buf := []byte{uint8(addr>>8) & 0xff, uint8(addr>>0) & 0xff}
137+
138+
n, err := dev.ft.Write(buf)
139+
switch {
140+
case err != nil:
141+
return fmt.Errorf("could not write USB command 0x%x: %w", cmd, err)
142+
case n != len(buf):
143+
return fmt.Errorf("could not write USB command 0x%x: %w", cmd, io.ErrShortWrite)
144+
}
145+
146+
return nil
147+
}
148+
149+
func (dev *device) usbRegWrite(addr, v uint32) error {
150+
var (
151+
a = addr & 0x3fff
152+
p = make([]byte, 6)
153+
)
154+
155+
binary.BigEndian.PutUint16(p[:2], uint16(a))
156+
binary.BigEndian.PutUint32(p[2:], uint32(v))
157+
and0xff(p)
158+
159+
n, err := dev.ft.Write(p)
160+
switch {
161+
case err != nil:
162+
return fmt.Errorf("could not write USB register (0x%x, 0x%x): %w", addr, v, err)
163+
case n != len(p):
164+
return fmt.Errorf("could not write USB register (0x%x, 0x%x): %w", addr, v, io.ErrShortWrite)
165+
}
166+
return nil
167+
}
168+
169+
func (dev *device) setChipTypeRegister(v uint32) error {
170+
return dev.usbRegWrite(0x00, v)
171+
}
172+
173+
func (dev *device) setDIFID(v uint32) error {
174+
return dev.usbRegWrite(0x01, v)
175+
}
176+
177+
func (dev *device) setControlRegister(v uint32) error {
178+
return dev.usbRegWrite(0x03, v)
179+
}
180+
181+
func (dev *device) getControlRegister() (uint32, error) {
182+
return dev.usbRegRead(0x03)
183+
}
184+
185+
func (dev *device) difCptReset() error {
186+
const addr = 0x03
187+
v, err := dev.usbRegRead(addr)
188+
if err != nil {
189+
return fmt.Errorf("could not read register 0x%x", addr)
190+
}
191+
192+
v |= 0x2000
193+
err = dev.usbRegWrite(addr, v)
194+
if err != nil {
195+
return fmt.Errorf("could not write to register 0x%x", addr)
196+
}
197+
198+
v &= 0xffffdfff
199+
err = dev.usbRegWrite(addr, v)
200+
if err != nil {
201+
return fmt.Errorf("could not write to register 0x%x", addr)
202+
}
203+
204+
return nil
205+
}
206+
207+
func (dev *device) setPwr2PwrARegister(v uint32) error { return dev.usbRegWrite(0x40, v) }
208+
func (dev *device) setPwrA2PwrDRegister(v uint32) error { return dev.usbRegWrite(0x41, v) }
209+
func (dev *device) setPwrD2DAQRegister(v uint32) error { return dev.usbRegWrite(0x42, v) }
210+
func (dev *device) setDAQ2PwrDRegister(v uint32) error { return dev.usbRegWrite(0x43, v) }
211+
func (dev *device) setPwrD2PwrARegister(v uint32) error { return dev.usbRegWrite(0x44, v) }
212+
213+
func (dev *device) setEventsBetweenTemperatureReadout(v uint32) error {
214+
return dev.usbRegWrite(0x55, v)
215+
}
216+
217+
func (dev *device) setAnalogConfigureRegister(v uint32) error {
218+
return dev.usbRegWrite(0x60, v)
219+
}
220+
221+
func (dev *device) usbFwVersion() (uint32, error) {
222+
return dev.usbRegRead(0x100)
223+
}
224+
225+
func (dev *device) hardrocFlushDigitalFIFO() error {
226+
return nil
227+
}
228+
229+
func (dev *device) hardrocStopDigitalAcquisitionCommand() error {
230+
return dev.usbCmdWrite(0x02)
231+
}
232+
233+
func (dev *device) hardrocSLCStatusRead() (uint32, error) {
234+
return dev.usbRegRead(0x06)
235+
}
236+
237+
func (dev *device) hardrocCmdSLCWrite() error {
238+
return dev.usbCmdWrite(0x01)
239+
}
240+
241+
func (dev *device) hardrocCmdSLCWriteCRC(v uint16) error {
242+
p := make([]byte, 2)
243+
binary.BigEndian.PutUint16(p, v)
244+
_, err := dev.ft.Write(p)
245+
return err
246+
}
247+
248+
func (dev *device) cmdSLCWriteSingleSLCFrame(p []byte) error {
249+
_, err := dev.ft.Write(p)
250+
return err
251+
}
252+
253+
func and0xff(p []byte) {
254+
for i := range p {
255+
p[i] &= 0xff
256+
}
257+
}

0 commit comments

Comments
 (0)