| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package wilco |
| |
| import ( |
| "context" |
| "io/ioutil" |
| "os" |
| "time" |
| |
| "chromiumos/tast/errors" |
| "chromiumos/tast/testing" |
| ) |
| |
| const ( |
| eventTriggerPath = "/sys/kernel/debug/wilco_ec/test_event" |
| eventReadPath = "/dev/wilco_event0" |
| maxEventSize = 16 |
| ) |
| |
| // TriggerECEvent writes data to the EC event trigger path and triggers a fake |
| // EC event. |
| func TriggerECEvent() error { |
| if err := ioutil.WriteFile(eventTriggerPath, []byte{0}, 0644); err != nil { |
| return errors.Wrapf(err, "failed to write to %v", eventTriggerPath) |
| } |
| return nil |
| } |
| |
| // ReadECEvent reads an EC event from the EC event device node. The event |
| // payload will be returned. |
| func ReadECEvent(ctx context.Context) ([]byte, error) { |
| f, err := os.OpenFile(eventReadPath, os.O_RDONLY, 0644) |
| if err != nil { |
| return nil, errors.Wrapf(err, "failed to open %v", eventReadPath) |
| } |
| defer f.Close() |
| |
| // Set the read deadline to the context deadline if it exists. |
| if t, ok := ctx.Deadline(); ok { |
| f.SetReadDeadline(t) |
| } |
| |
| payload := make([]byte, maxEventSize) |
| n, err := f.Read(payload) |
| if os.IsTimeout(err) { |
| return nil, err |
| } |
| if err != nil { |
| return nil, errors.Wrapf(err, "failed to read from %v", eventReadPath) |
| } |
| |
| return payload[:n], nil |
| } |
| |
| // ClearECEventQueue will read all of the currently available events in the wilco |
| // EC device node queue. These events are discarded. |
| func ClearECEventQueue(ctx context.Context) error { |
| for { |
| readCtx, cancel := context.WithDeadline(ctx, time.Now().Add(100*time.Millisecond)) |
| defer cancel() |
| event, err := ReadECEvent(readCtx) |
| // If we have timedout reading the file, we have drained the queue. |
| if os.IsTimeout(err) { |
| break |
| } |
| if err != nil { |
| return errors.Wrap(err, "unable to read EC event file") |
| } |
| |
| testing.ContextLogf(ctx, "Removing stale event from EC event queue: [% #x]", event) |
| } |
| return nil |
| } |