1 #include "example_device.hpp" 2 3 #include "common/include/device.hpp" 4 #include "common/include/software_config.hpp" 5 #include "common/include/software_manager.hpp" 6 7 #include <phosphor-logging/lg2.hpp> 8 #include <sdbusplus/asio/connection.hpp> 9 #include <sdbusplus/asio/object_server.hpp> 10 #include <sdbusplus/async.hpp> 11 #include <sdbusplus/server.hpp> 12 #include <xyz/openbmc_project/Association/Definitions/server.hpp> 13 #include <xyz/openbmc_project/Software/Update/server.hpp> 14 15 #include <memory> 16 17 PHOSPHOR_LOG2_USING; 18 19 using namespace phosphor::software; 20 using namespace phosphor::software::config; 21 using namespace phosphor::software::manager; 22 using namespace phosphor::software::device; 23 using namespace phosphor::software::example_device; 24 25 SoftwareConfig ExampleDevice::defaultConfig = 26 SoftwareConfig(exampleInvObjPath, exampleVendorIANA, 27 exampleCompatibleHardware, "Nop", exampleName); 28 29 long ExampleCodeUpdater::getRandomId() 30 { 31 struct timespec ts; 32 clock_gettime(CLOCK_REALTIME, &ts); 33 unsigned int seed = ts.tv_nsec ^ getpid(); 34 srandom(seed); 35 return random() % 10000; 36 } 37 38 // nop code updater needs unique suffix on dbus for parallel unit testing 39 ExampleCodeUpdater::ExampleCodeUpdater(sdbusplus::async::context& ctx, 40 long uniqueSuffix) : 41 SoftwareManager(ctx, "ExampleUpdater" + std::to_string(uniqueSuffix)) 42 {} 43 44 sdbusplus::async::task<bool> ExampleCodeUpdater::initDevice( 45 const std::string& /*unused*/, const std::string& /*unused*/, 46 SoftwareConfig& /*unused*/) 47 { 48 auto device = std::make_unique<ExampleDevice>(ctx, this); 49 50 device->softwareCurrent = std::make_unique<Software>(ctx, *device); 51 52 device->softwareCurrent->setVersion("v1.0"); 53 device->softwareCurrent->setActivation( 54 SoftwareActivation::Activations::Active); 55 56 auto applyTimes = {RequestedApplyTimes::OnReset}; 57 device->softwareCurrent->enableUpdate(applyTimes); 58 59 devices.insert({exampleInvObjPath, std::move(device)}); 60 61 co_return true; 62 } 63 64 ExampleDevice::ExampleDevice(sdbusplus::async::context& ctx, 65 SoftwareManager* parent, 66 const SoftwareConfig& config) : 67 Device(ctx, config, parent, 68 {RequestedApplyTimes::Immediate, RequestedApplyTimes::OnReset}) 69 {} 70 71 sdbusplus::async::task<bool> ExampleDevice::updateDevice( 72 const uint8_t* /*unused*/, size_t compImageSize) 73 { 74 debug("Called device specific update function with image size {SIZE}", 75 "SIZE", compImageSize); 76 77 deviceSpecificUpdateFunctionCalled = true; 78 79 // Setting this property for demonstration purpose. 80 // For a real device, this could represent the 81 // percentage completion of writing the firmware, 82 // and any progress made in the update process within this function. 83 // There is no hard constraint on the values here, 84 // we do not have to reach any specific percentage. 85 // The percentage should be monotonic and increasing. 86 for (auto progress = 0; progress <= 100; progress += 20) 87 { 88 setUpdateProgress(progress); 89 } 90 91 co_return true; 92 } 93