Всем доброго времени суток!
Заставили тут меня разбираться с драйверами под линукс( Но опыт написания этих драйверов напрочь отсутствует(
Перейду сразу к вопросам.
Есть функция
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 с ядром и дальше с драйвером?
Спасибо всем заранее.
+ if ((strict_strtol(buf, 10, &val) < 0) || (val > 6))
> + if ((strict_strtol(buf, 10, &val) < 0) || (val
> > 6))но вообще опасно. даже если стандарт скажет, что функция таки вызовется до , всегда
есть возможность нарваться на хитрооптимизирующий компилятор.я бы разнес на 2 строки ..
>> + if ((strict_strtol(buf, 10, &val) < 0) || (val
>> > 6))
> но вообще опасно. даже если стандарт скажет, что функция таки вызовется
> до , всегда
> есть возможность нарваться на хитрооптимизирующий компилятор.
> я бы разнес на 2 строки ..Такое сплошь и рядом встречается и пока мир не обрушился. Так что все в порядке.
> Спасибо всем заранее.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...