|
|
|
@ -42,6 +42,8 @@ public:
@@ -42,6 +42,8 @@ public:
|
|
|
|
|
FUNCTOR_TYPEDEF(PeriodicCb, void); |
|
|
|
|
typedef void* PeriodicHandle; |
|
|
|
|
|
|
|
|
|
FUNCTOR_TYPEDEF(BankSelectCb, bool, uint8_t); |
|
|
|
|
|
|
|
|
|
Device(enum BusType type) |
|
|
|
|
{ |
|
|
|
|
_bus_id.devid_s.bus_type = type; |
|
|
|
@ -132,6 +134,56 @@ public:
@@ -132,6 +134,56 @@ public:
|
|
|
|
|
return transfer(buf, sizeof(buf), nullptr, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Wrapper function over #transfer() to call bank selection callback |
|
|
|
|
* and then invoke the transfer call |
|
|
|
|
* |
|
|
|
|
* Return: true on a successful transfer, false on failure. |
|
|
|
|
*/ |
|
|
|
|
bool transfer_bank(uint8_t bank, const uint8_t *send, uint32_t send_len, |
|
|
|
|
uint8_t *recv, uint32_t recv_len) { |
|
|
|
|
if (_bank_select) { |
|
|
|
|
if (!_bank_select(bank)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return transfer(send, send_len, recv, recv_len); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Wrapper function over #transfer_bank() to read recv_len registers, starting |
|
|
|
|
* by first_reg, into the array pointed by recv. The read flag passed to |
|
|
|
|
* #set_read_flag(uint8_t) is ORed with first_reg before performing the |
|
|
|
|
* transfer. |
|
|
|
|
* |
|
|
|
|
* Return: true on a successful transfer, false on failure. |
|
|
|
|
*/ |
|
|
|
|
bool read_bank_registers(uint8_t bank, uint8_t first_reg, uint8_t *recv, uint32_t recv_len) |
|
|
|
|
{ |
|
|
|
|
first_reg |= _read_flag; |
|
|
|
|
return transfer_bank(bank, &first_reg, 1, recv, recv_len); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Wrapper function over #transfer_bank() to write a byte to the register reg. |
|
|
|
|
* The transfer is done by sending reg and val in that order. |
|
|
|
|
* |
|
|
|
|
* Return: true on a successful transfer, false on failure. |
|
|
|
|
*/ |
|
|
|
|
bool write_bank_register(uint8_t bank, uint8_t reg, uint8_t val, bool checked=false) |
|
|
|
|
{ |
|
|
|
|
uint8_t buf[2] = { reg, val }; |
|
|
|
|
if (checked) { |
|
|
|
|
set_checked_register(bank, reg, val); |
|
|
|
|
} |
|
|
|
|
return transfer_bank(bank, buf, sizeof(buf), nullptr, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* set a value for a checked register in a bank |
|
|
|
|
*/ |
|
|
|
|
void set_checked_register(uint8_t bank, uint8_t reg, uint8_t val); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* set a value for a checked register |
|
|
|
|
*/ |
|
|
|
@ -198,6 +250,20 @@ public:
@@ -198,6 +250,20 @@ public:
|
|
|
|
|
*/ |
|
|
|
|
virtual bool unregister_callback(PeriodicHandle h) { return false; } |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Sets a bank_select callback to be used for bank selection during register check |
|
|
|
|
*/ |
|
|
|
|
virtual void setup_bankselect_callback(BankSelectCb bank_select) { |
|
|
|
|
_bank_select = bank_select; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Sets a bank_select callback to be used for bank selection during register check |
|
|
|
|
*/ |
|
|
|
|
virtual void deregister_bankselect_callback() { |
|
|
|
|
_bank_select = nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
allows to set callback that will be called after DMA transfer complete. |
|
|
|
@ -322,8 +388,11 @@ protected:
@@ -322,8 +388,11 @@ protected:
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
BankSelectCb _bank_select; |
|
|
|
|
|
|
|
|
|
// checked registers
|
|
|
|
|
struct checkreg { |
|
|
|
|
uint8_t bank; |
|
|
|
|
uint8_t regnum; |
|
|
|
|
uint8_t value; |
|
|
|
|
}; |
|
|
|
|