поэтому, прежде чем я получу обличье "ты не должен этого делать", я знаю, что не должен. Но это для грязного, быстрого доказательства концепции для некоторой исследовательской работы. Если концепция сработает, я посмотрю на правильный экспорт информации в мой модуль. Мои знания в этой области очень малы, так как я когда-либо использовал sysfs только для раскрытия значений, которые я генерирую в своих модулях, любые указатели в правильном направлении будут с благодарностью. Я много гуглил и, к сожалению, потерпел неудачу.
Чего мне нужно достичь:
Мне нужно прочитать значения устройства и sysfs для датчиков мощности и графического процессора для моей конкретной платы Android (Odroid XU3), работающей с ядром 3.10.9.
Где работает мой модуль:
Я пишу регулятор мощности cpufreq, который пытается создать FSM из системной информации (отсюда и необходимость чтения файлов).
В моем регуляторе я пытаюсь открыть файлы в файловых указателях, которые затем буду хранить и читать каждый флажок регулятора.
struct file* f_mali_freq;
struct file* f_mali_load;
struct file* f_big_ina231;
struct file* f_little_ina231;
struct file* f_mem_ina231;
struct file* f_gpu_ina231;
Затем я попытался реализовать методы, подобные тем, которые объясняют здесь и здесь .
В настоящее время я пробовал следующее для файлов моих датчиков:
определяет и структурирует
#define INA231_IOCGREG _IOR('i', 1, struct ina231_iocreg *)
#define INA231_IOCSSTATUS _IOW('i', 2, struct ina231_iocreg *)
#define INA231_IOCGSTATUS _IOR('i', 3, struct ina231_iocreg *)
struct ina231_iocreg {
unsigned char name[20];
unsigned int enable;
unsigned int cur_uV;
unsigned int cur_uA;
unsigned int cur_uW;
} __attribute__ ((packed));
вызвано из инициата моего губернатора
f_big_ina231 = open_ina231("/dev/sensor_arm");
static struct file *open_ina231(const char *path)
{
mm_segment_t old_fs = get_fs();
struct ina231_iocreg reg;
struct file *f;
int ret;
f = file_open(path);
if (!f)
return NULL; // <FAILS HERE
set_fs(KERNEL_DS);
if (!f->f_op || !f->f_op->unlocked_ioctl)
goto out_error;
/* enable if necessary */
ret = f->f_op->unlocked_ioctl(f, INA231_IOCGSTATUS, (long unsigned int) ®);
if (ret)
goto out_error;
if (!reg.enable) {
reg.enable = true;
ret = f->f_op->unlocked_ioctl(f, INA231_IOCSSTATUS, (long unsigned int) ®);
if (ret)
goto out_error;
}
set_fs(old_fs);
return f;
out_error:
KERNEL_DEBUG_MSG(" [OPTIGOV] open_ina231 out_error\n");
set_fs(old_fs);
filp_close(f, NULL);
return NULL;
}
static struct file* file_open(const char *path){
struct file *f = NULL;
f = filp_open(path, O_RDWR, 0);
if(IS_ERR(f)){
KERNEL_DEBUG_MSG(" [OPTIGOV] file_open failed filp_open\n");
return NULL;
}
return f;
}
Открытие файла всегда заканчивается неудачей, поэтому я могу прийти к единственному выводу, что файл не существует. Таким образом, я переместил код в повторяющуюся задачу моего губернатора с флагом «открыт», который помешал бы повторному открытию файлов. Это дало те же результаты, когда файлы не могли быть открыты.
Я попробовал более упрощенный подход (ниже), который также не удался.
f_mali_load = file_open("/sys/bus/platform/drivers/mali/11800000.mali/utilization");
static struct file* file_open(const char *path){
struct file *f = NULL;
mm_segment_t oldfs;
int err = 0;
oldfs = get_fs();
set_fs(get_ds());
f = filp_open(path, O_RDONLY, 0);
set_fs(oldfs);
if(IS_ERR(f)){
KERNEL_DEBUG_MSG(" [OPTIGOV] file_open failed filp_open\n");
return NULL; // <FAILS HERE
}
KERNEL_DEBUG_MSG(" [OPTIGOV] file_open succedded filp_open\n");
return f;
}
Я надеюсь, что кто-то может помочь или указать мне правильное направление, поскольку я не могу на всю жизнь понять, чего мне не хватает.
Мне не удалось найти способ проверки, существует ли файл в ядре (кроме попыток открыть его, что я и делаю).
Приветствия