The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
работа драйвера , !*! amatorIP, 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 с ядром и дальше с драйвером?
Спасибо всем заранее.

  • работа драйвера , !*! cryo, 00:55 , 19-Май-11 (1)
    +    if ((strict_strtol(buf, 10, &val) < 0) || (val > 6))

    • работа драйвера , !*! Alex_S, 05:26 , 30-Май-11 (2)
      > +    if ((strict_strtol(buf, 10, &val) < 0) || (val
      > > 6))

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

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

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

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

  • работа драйвера , !*! pavlinux, 15:18 , 02-Июн-11 (4)
    > Спасибо всем заранее.

    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...





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

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