Как получить доступ к информации о драйвере из ядра? - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю с управлением процессором на платах big.LITTLE, и на плате, на которой я работаю, есть несколько датчиков мощности ina231. Который я считаю, обрабатываются ina2xx_driver (это будет иметь смысл для меня). Мои знания о драйверах все еще находятся в стадии разработки, поэтому я не уверен, как мне получить информацию, необходимую для моего модуля ЦП, из драйверов / устройств таким образом, чтобы не рассердить богов Linux.

На плате есть 4 датчика, которые, я полагаю, затем сохраняются в struct i2c_driver в связанном списке struct list_head clients. Если я правильно понял, то моей первоначальной идеей было экспортировать указатель на драйвер

   static struct i2c_driver ina2xx_driver = { 
       .driver = { 
           .name   = "ina2xx",
       },  
       .probe      = ina2xx_probe,
       .remove     = ina2xx_remove,
       .id_table   = ina2xx_id,
   };

   +struct i2c_driver *ina2xx_driver_p = &ina2xx_driver;

   +EXPORT_SYMBOL(ina2xx_driver_p);

к моему модулю, который затем может пройти по связанному списку клиентов i2c, позволяя мне получить доступ к информации об отдельном устройстве, выполнив что-то вроде этого

struct i2c_client *tmp
struct list_head *pos;
struct list_head *clients_head = &ina2xx_driver_p->clients; 

list_for_each(pos, clients_head){
    tmp = list_entry(pos, struct i2c_client, detected)
    struct ina2xx_data *data = ina2xx_update_device(tmp.dev);
    ina2xx_get_value(data, $(attribute));
}

На самом деле я не пробовал это, просто я представляю одно решение после чтения заголовочных файлов. Учитывая мое отсутствие знаний о рекомендуемой практике, я подумал, что лучше спросить, прежде чем тратить день или два, пытаясь реализовать что-то, что обречено на провал.

Существует ли более стандартизированный способ, используемый в ядре для получения драйвера устройства или указателей устройства для доступа к информации или способ получения информации об устройстве, не считывая ее из файлов?

Надеюсь, мой вопрос имеет смысл и спасибо.

1 Ответ

0 голосов
/ 22 ноября 2018

Датчик ina231 на вашей плате, скорее всего, создан от DeviceTree.Если это так, и ваш драйвер также создается из DT, то было бы естественным сохранить датчик phandle to ina231 в качестве свойства в вашем узле DT.Затем вы можете использовать of_find_node_by_phandle(), чтобы получить struct device_node, а затем использовать of_find_i2c_device_by_node, чтобы превратить его в struct i2c_client.

. Альтернативным подходом будет использование bus_find_device() с &i2c_bus_type в качестве первогоаргумент и используя ваш пользовательский match function.Посмотрите реализацию of_find_i2c_device_by_node в качестве примера того, как это можно использовать.

Обратите внимание, что ничего из этого не будет симпатичным, поскольку вы планируете использовать личные внутренние данные драйвера, что само по себе не является хорошей практикой.

...