The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"работа драйвера "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"работа драйвера "  +/
Сообщение от amatorIP email(ok) on 19-Май-11, 00:00 
Всем доброго времени суток!
Заставили тут меня разбираться с драйверами под линукс( Но опыт написания этих драйверов напрочь отсутствует(
Перейду сразу к вопросам.
Есть функция
static ssize_t hmc5843_store_rate(struct device *dev,
+                  struct device_attribute *attr,
+                  const char *buf, size_t count)
+{
+    struct i2c_client *client = to_i2c_client(dev);
+    struct hmc5843 *hmc5843 = i2c_get_clientdata(client);
+    unsigned long val;
+    int status = count;
+
+    if ((strict_strtol(buf, 10, &val) < 0) || (val > 6))
+        return -EINVAL;
+    mutex_lock(&hmc5843->lock);
+    if (hmc5843->rate != val) {
+        hmc5843->rate = val;
+        hmc5843->ipdev->poll_interval = hmc5843_sample_interval[val];
+        status = hmc5843_write_register(hmc5843, HMC5843_CFG_A_REG);
+    }
+    mutex_unlock(&hmc5843->lock);
+    return status;
+}

Исходник находится по ссылке https://patchwork.kernel.org/patch/66557/
Так вот.
Вот объявлена переменная
unsigned long val;
и сразу же через пару строк идет проверка
if (hmc5843->rate != val)
я не могу понять с чем мы сравниваем? Когда было присвоено значение этой переменной?
И еще один вопрос. Когда я в интерфейсе пользователя выбираю разные режимы, то каким образом происходит взаимодействие UI с ядром и дальше с драйвером?
Спасибо всем заранее.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "работа драйвера "  +/
Сообщение от cryo (ok) on 19-Май-11, 00:55 
+    if ((strict_strtol(buf, 10, &val) < 0) || (val > 6))

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "работа драйвера "  +/
Сообщение от Alex_S (??) on 30-Май-11, 05:26 
> +    if ((strict_strtol(buf, 10, &val) < 0) || (val
> > 6))

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

я бы разнес на 2 строки ..

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "работа драйвера "  +/
Сообщение от delete (ok) on 30-Май-11, 06:52 
>> +    if ((strict_strtol(buf, 10, &val) < 0) || (val
>> > 6))
>  но вообще опасно. даже если стандарт скажет, что функция таки вызовется
> до ,  всегда
> есть возможность нарваться на хитрооптимизирующий компилятор.
>  я бы разнес на 2 строки ..

Такое сплошь и рядом встречается и пока мир не обрушился. Так что все в порядке.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "работа драйвера "  +/
Сообщение от pavlinux (ok) on 02-Июн-11, 15:18 
> Спасибо всем заранее.

1. unsigned long val; должно быть long val;

2. Перед использованием можно инициализировать - long val = 7;

3. strict_strtol(buf, 10, &val) возвращает 0 в случае успеха, остальные значения - ошибка.

4. int status должно быть ssize_t, т.к. вся функция возвращает ssize_t (на 32бита пофиг, на 64 это long int)  

---
    long val;
    ssize_t status = count;

    val = 7;
    if ((strict_strtol(buf, 10, &val) != 0) || (val > 6))
        return -EINVAL;


P.S.
Оно уже давно в ядре :)
http://lxr.linux.no/#linux+v2.6.39/drivers/staging/iio/magne...


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру