Add spi endian setting.

pull/60/head
xiangbingj 2019-11-12 11:51:56 +08:00
parent 9ed4e8604c
commit ad401d5b09
4 changed files with 22 additions and 0 deletions

View File

@ -90,6 +90,7 @@ public:
virtual object_ptr<spi_device_driver> get_device(spi_mode_t mode, spi_frame_format_t frame_format, uint32_t chip_select_mask, uint32_t data_bit_length) override;
double set_clock_rate(k_spi_device_driver &device, double clock_rate);
void set_endian(k_spi_device_driver &device, uint32_t endian);
int read(k_spi_device_driver &device, gsl::span<uint8_t> buffer);
int write(k_spi_device_driver &device, gsl::span<const uint8_t> buffer);
int transfer_full_duplex(k_spi_device_driver &device, gsl::span<const uint8_t> write_buffer, gsl::span<uint8_t> read_buffer);
@ -562,6 +563,11 @@ public:
return spi_->set_clock_rate(*this, clock_rate);
}
virtual void set_endian(uint32_t endian) override
{
spi_->set_endian(*this, endian);
}
virtual int read(gsl::span<uint8_t> buffer) override
{
return spi_->read(*this, buffer);
@ -626,6 +632,7 @@ private:
spi_inst_addr_trans_mode_t trans_mode_;
uint32_t baud_rate_ = 0x2;
uint32_t buffer_width_ = 0;
uint32_t endian_ = 0;
};
object_ptr<spi_device_driver> k_spi_driver::get_device(spi_mode_t mode, spi_frame_format_t frame_format, uint32_t chip_select_mask, uint32_t data_bit_length)
@ -645,6 +652,11 @@ double k_spi_driver::set_clock_rate(k_spi_device_driver &device, double clock_ra
return clk / div;
}
void k_spi_driver::set_endian(k_spi_device_driver &device, uint32_t endian)
{
device.endian_ = endian;
}
int k_spi_driver::read(k_spi_device_driver &device, gsl::span<uint8_t> buffer)
{
COMMON_ENTRY;
@ -994,6 +1006,7 @@ void k_spi_driver::setup_device(k_spi_device_driver &device)
uint32_t addr_l = device.address_length_ / 4;
spi_.spi_ctrlr0 = (device.wait_cycles_ << 11) | (inst_l << 8) | (addr_l << 2) | trans;
spi_.endian = device.endian_;
}
}

View File

@ -319,6 +319,8 @@ void spi_dev_config_non_standard(handle_t file, uint32_t instruction_length, uin
*/
double spi_dev_set_clock_rate(handle_t file, double clock_rate);
void spi_dev_set_endian(handle_t file, uint32_t endian);
/**
* @brief Transfer data between a SPI device using full duplex
*

View File

@ -243,6 +243,7 @@ class spi_device_driver : public driver
public:
virtual void config_non_standard(uint32_t instruction_length, uint32_t address_length, uint32_t wait_cycles, spi_inst_addr_trans_mode_t trans_mode) = 0;
virtual double set_clock_rate(double clock_rate) = 0;
virtual void set_endian(uint32_t endian) = 0;
virtual int read(gsl::span<uint8_t> buffer) = 0;
virtual int write(gsl::span<const uint8_t> buffer) = 0;
virtual int transfer_full_duplex(gsl::span<const uint8_t> write_buffer, gsl::span<uint8_t> read_buffer) = 0;

View File

@ -488,6 +488,12 @@ double spi_dev_set_clock_rate(handle_t file, double clock_rate)
return spi_device->set_clock_rate(clock_rate);
}
void spi_dev_set_endian(handle_t file, uint32_t endian)
{
COMMON_ENTRY(spi_device);
return spi_device->set_endian(endian);
}
int spi_dev_transfer_full_duplex(handle_t file, const uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len)
{
COMMON_ENTRY(spi_device);