summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorJean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>2022-02-24 12:33:43 +0100
committerJean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>2022-03-28 12:31:37 +0200
commitf84e5e01a4dbec6183c53810d1e579d32674aaae (patch)
tree992bc7bf194976ba179335800ed604847d53cca7 /src/android
parent4efca856c040ce78b08534a41190ae6c63326e04 (diff)
ipa: rkisp1: Use frame counter for the request queued
Introduce a frameCount variable in the IPAFrameContext which increments each time a request is queued. It is reset at configure call, when the camera is started. This will allow the frameCount to be used by other algorithms, without having to keep multiple private frame counters. Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/android')
0 files changed, 0 insertions, 0 deletions
5'>105 106 107 108 109 110
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2020, Google Inc.
 *
 * sysfs.cpp - Miscellaneous utility functions to access sysfs
 */

#include "libcamera/internal/sysfs.h"

#include <fstream>
#include <sstream>
#include <sys/stat.h>
#include <sys/sysmacros.h>

#include "libcamera/internal/file.h"
#include "libcamera/internal/log.h"

/**
 * \file sysfs.h
 * \brief Miscellaneous utility functions to access sysfs
 */

namespace libcamera {

LOG_DEFINE_CATEGORY(SysFs);

namespace sysfs {

/**
 * \brief Retrieve the sysfs path for a character device
 * \param[in] deviceNode Path to character device node
 * \return The sysfs path on success or an empty string on failure
 */
std::string charDevPath(const std::string &deviceNode)
{
	struct stat st;
	int ret = stat(deviceNode.c_str(), &st);
	if (ret < 0) {
		ret = -errno;
		LOG(SysFs, Error)
			<< "Unable to stat '" << deviceNode << "': "
			<< strerror(-ret);
		return {};
	}

	std::ostringstream dev("/sys/dev/char/", std::ios_base::ate);
	dev << major(st.st_rdev) << ":" << minor(st.st_rdev);

	return dev.str();
}

/**
 * \brief Retrieve the path of the firmware node for a device
 * \param[in] device Path in sysfs to search
 *
 * Physical devices in a system are described by the system firmware. Depending
 * on the type of platform, devices are identified using different naming
 * schemes. The Linux kernel abstract those differences with "firmware nodes".
 * This function retrieves the firmware node path corresponding to the
 * \a device.
 *
 * For DT-based systems, the path is the full name of the DT node that
 * represents the device. For ACPI-based systems, the path is the absolute
 * namespace path to the ACPI object that represents the device. In both cases,
 * the path is guaranteed to be unique and persistent as long as the system
 * firmware is not modified.
 *
 * \return The firmware node path on success or an empty string on failure
 */
std::string firmwareNodePath(const std::string &device)
{
	std::string fwPath, node;

	/* Lookup for DT-based systems */
	node = device + "/of_node";
	if (File::exists(node)) {
		char *ofPath = realpath(node.c_str(), nullptr);
		if (!ofPath)
			return {};

		static const char prefix[] = "/sys/firmware/devicetree";
		if (strncmp(ofPath, prefix, strlen(prefix)) == 0)
			fwPath = ofPath + strlen(prefix);
		else
			fwPath = ofPath;

		free(ofPath);

		return fwPath;
	}

	/* Lookup for ACPI-based systems */
	node = device + "/firmware_node/path";
	if (File::exists(node)) {
		std::ifstream file(node);
		if (!file.is_open())
			return {};

		std::getline(file, fwPath);
		file.close();

		return fwPath;
	}

	return {};
}

} /* namespace sysfs */

} /* namespace libcamera */