ret_val = kstrtoul(buf, 10, &val); if (ret_val) return ret_val;
if (val < 4096)
val = 1; elseif (val < 65536)
val = 2; else return -ERANGE;
pm_runtime_get_sync(dev);
/* Make sure nobody else reads/modifies/writes 0x81 while we
are active */
mutex_lock(&data->mutex);
ret_val = i2c_smbus_read_byte_data(client, 0x81); if (ret_val < 0) goto fail;
/* Reset the bits before setting them */
ret_val = ret_val & 0xFA;
if (val == 1) /* Setting detection range up to 4k LUX */
ret_val = (ret_val | 0x01); else/* Setting detection range up to 64k LUX*/
ret_val = (ret_val | 0x00);
staticint als_set_default_config(struct i2c_client *client)
{ int ret_val; /* Write the command and then switch on */
ret_val = i2c_smbus_write_byte_data(client, 0x80, 0x01); if (ret_val < 0) {
dev_err(&client->dev, "failed default switch on write\n"); return ret_val;
} /* detection range: 1~64K Lux, maunal measurement */
ret_val = i2c_smbus_write_byte_data(client, 0x81, 0x08); if (ret_val < 0)
dev_err(&client->dev, "failed default LUX on write\n");
/* We always get 0 for the 1st measurement after system power on, * so make sure it is finished before user asks for data.
*/
als_wait_for_data_ready(&client->dev);
return ret_val;
}
staticint apds9802als_probe(struct i2c_client *client)
{ int res; struct als_data *data;
data = kzalloc(sizeof(struct als_data), GFP_KERNEL); if (data == NULL) {
dev_err(&client->dev, "Memory allocation failed\n"); return -ENOMEM;
}
i2c_set_clientdata(client, data);
res = sysfs_create_group(&client->dev.kobj, &m_als_gr); if (res) {
dev_err(&client->dev, "device create file failed\n"); goto als_error1;
}
dev_info(&client->dev, "ALS chip found\n");
als_set_default_config(client);
mutex_init(&data->mutex);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.