работа драйвера , 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...
|