#linux-kernel #kernel #linux-device-driver #kernel-module #linux-development
Вопрос:
Я работаю над написанием модуля драйвера ядра hwmon для чипа, который взаимодействует через LPC (шина в стиле ISA). До сих пор у меня есть следующий код
umode_t qnap_ec_is_visible(const void* data, enum hwmon_sensor_types type, u32 attr, int channel)
{
}
int qnap_ec_read(struct device* dev, enum hwmon_sensor_types type, u32 attr, int channel, long* val)
{
}
int qnap_ec_write(struct device* dev, enum hwmon_sensor_types type, u32 attr, int channel, long val)
{
}
static const struct hwmon_ops qnap_ec_ops = {
.is_visible = qnap_ec_is_visible,
.read = qnap_ec_read,
.write = qnap_ec_write
};
static const struct hwmon_channel_info *qnap_ec_channel_info[] = {
HWMON_CHANNEL_INFO(pwm, HWMON_PWM_INPUT),
HWMON_CHANNEL_INFO(fan, HWMON_F_INPUT),
HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
NULL
};
static const struct hwmon_chip_info qnap_ec_chip_info = {
.ops = amp;qnap_ec_ops,
.info = qnap_ec_channel_info
};
static int qnap_ec_probe(struct platform_device* platform_dev)
{
struct device* dev;
dev = devm_hwmon_device_register_with_info(amp;platform_dev->dev, "qnap_ec_hwmon", NULL,
amp;qnap_ec_chip_info, NULL);
return PTR_ERR_OR_ZERO(dev);
}
static const struct of_device_id qnap_ec_of_match[] = {
{ .compatible = "???" },
{}
};
MODULE_DEVICE_TABLE(of, qnap_ec_of_match);
static struct platform_driver qnap_ec_driver = {
.driver = {
.name = "qnap_ec_hwmon",
.of_match_table = qnap_ec_of_match
},
.probe = qnap_ec_probe
};
module_platform_driver(qnap_ec_driver);
однако я почти уверен, что этот подход (использование идентификатора устройства и вызов ядром функции проверки, когда оно находит этот идентификатор устройства в системе) не будет работать для чего-либо на шине LPC. Драйвер IT87, который также взаимодействует по шине LPC, использует функции __init/__exit для ввода драйвера, однако этот драйвер очень большой и, вероятно, не является идеальным примером простого модуля драйвера. Существуют ли какие-либо доступные примеры того, как написать базовый (т. Е. без реальной функциональности, только скелет) драйвер ядра hwmon для устройства LPC? Некоторые из вещей, на которые я не могу найти ответы, например, если я использую функции __init/__exit, могу ли я все еще зарегистрировать драйвер с помощью функции devm_hwmon_device_register_with_info или мне нужно использовать другой подход (драйвер it87, например, использует функцию platform_driver_register, но я не уверен, почему, поскольку, похоже, нет никакой документации о правильном подходе для устройств LPC).
Комментарии:
1. Является ли это платформой с поддержкой ACPI? Во многих биологических системах доступ должен основываться исключительно на вызове методов ACPI (интерфейс WMI или EC).
2. В соответствии с вашим вопросом, каждый водитель должен использовать разделы инициализации и выхода.