#include "api.h" #include #include #include #include #include #include #include #include #include /*************************************************************************************************/ void UltraSoundDevice::sanityCheck(uint32_t address, uint32_t bar) { if(bar >= BAR_NUM) { throw(myexception("Wrong bar number")); } if(address >= bars[bar].size) { throw(myexception("Bar overflow")); } } /*************************************************************************************************/ UltraSoundDevice::UltraSoundDevice() { #if 0 bars[0].size = 64 * 1024; bars[1].size = 128 * 1024 * 1024; bars[2].size = 8 * 1024; #else bars[0].size = 32 * 1024 * 1024; bars[1].size = 128 * 1024 * 1024; bars[2].size = 16 * 1024; #endif for(int i = 0; i < BAR_NUM; i++) { char str[64]; sprintf(str, "%s_%d", "/proc/usd_reg", i); bars[i].file = open(str, O_RDWR, 0); bars[i].ptr = mmap(NULL, bars[i].size, PROT_READ | PROT_WRITE, MAP_SHARED, bars[i].file , 0); } } /*************************************************************************************************/ UltraSoundDevice::~UltraSoundDevice() { for(int i = 0; i < BAR_NUM; i++) { munmap(bars[i].ptr, bars[i].size); close(bars[i].file); } } /*************************************************************************************************/ uint8_t UltraSoundDevice::readByte(uint32_t address, uint32_t bar) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); return ptr[address]; } /*************************************************************************************************/ uint16_t UltraSoundDevice::readShort(uint32_t address, uint32_t bar) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); return ptr[address]; } /*************************************************************************************************/ uint32_t UltraSoundDevice::readWord(uint32_t address, uint32_t bar) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); return ptr[address / 4]; } /*************************************************************************************************/ uint64_t UltraSoundDevice::readLong(uint32_t address, uint32_t bar) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); return ptr[address]; } /*************************************************************************************************/ void UltraSoundDevice::writeByte(uint32_t address, uint32_t bar, uint8_t data) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); ptr[address] = data; } /*************************************************************************************************/ void UltraSoundDevice::writeShort(uint32_t address, uint32_t bar, uint16_t data) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); ptr[address / 2] = data; } /*************************************************************************************************/ void UltraSoundDevice::writeWord(uint32_t address, uint32_t bar, uint32_t data) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); ptr[address / 4] = data; } /*************************************************************************************************/ void UltraSoundDevice::writeLong(uint32_t address, uint32_t bar, uint64_t data) { sanityCheck(address, bar); auto ptr = static_cast(bars[bar].ptr); ptr[address / 8] = data; }