📄 applesmc.c
字号:
out: mutex_unlock(&applesmc_lock);}/* Sysfs Files */static ssize_t applesmc_name_show(struct device *dev, struct device_attribute *attr, char *buf){ return snprintf(buf, PAGE_SIZE, "applesmc\n");}static ssize_t applesmc_position_show(struct device *dev, struct device_attribute *attr, char *buf){ int ret; s16 x, y, z; mutex_lock(&applesmc_lock); ret = applesmc_read_motion_sensor(SENSOR_X, &x); if (ret) goto out; ret = applesmc_read_motion_sensor(SENSOR_Y, &y); if (ret) goto out; ret = applesmc_read_motion_sensor(SENSOR_Z, &z); if (ret) goto out;out: mutex_unlock(&applesmc_lock); if (ret) return ret; else return snprintf(buf, PAGE_SIZE, "(%d,%d,%d)\n", x, y, z);}static ssize_t applesmc_light_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ int ret; u8 left = 0, right = 0; u8 buffer[6]; mutex_lock(&applesmc_lock); ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, 6); left = buffer[2]; if (ret) goto out; ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, 6); right = buffer[2];out: mutex_unlock(&applesmc_lock); if (ret) return ret; else return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", left, right);}/* Displays degree Celsius * 1000 */static ssize_t applesmc_show_temperature(struct device *dev, struct device_attribute *devattr, char *sysfsbuf){ int ret; u8 buffer[2]; unsigned int temp; struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); const char* key = temperature_sensors_sets[applesmc_temperature_set][attr->index]; mutex_lock(&applesmc_lock); ret = applesmc_read_key(key, buffer, 2); temp = buffer[0]*1000; temp += (buffer[1] >> 6) * 250; mutex_unlock(&applesmc_lock); if (ret) return ret; else return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", temp);}static ssize_t applesmc_show_fan_speed(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ int ret; unsigned int speed = 0; char newkey[5]; u8 buffer[2]; struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr); newkey[0] = fan_speed_keys[sensor_attr->nr][0]; newkey[1] = '0' + sensor_attr->index; newkey[2] = fan_speed_keys[sensor_attr->nr][2]; newkey[3] = fan_speed_keys[sensor_attr->nr][3]; newkey[4] = 0; mutex_lock(&applesmc_lock); ret = applesmc_read_key(newkey, buffer, 2); speed = ((buffer[0] << 8 | buffer[1]) >> 2); mutex_unlock(&applesmc_lock); if (ret) return ret; else return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", speed);}static ssize_t applesmc_store_fan_speed(struct device *dev, struct device_attribute *attr, const char *sysfsbuf, size_t count){ int ret; u32 speed; char newkey[5]; u8 buffer[2]; struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr); speed = simple_strtoul(sysfsbuf, NULL, 10); if (speed > 0x4000) /* Bigger than a 14-bit value */ return -EINVAL; newkey[0] = fan_speed_keys[sensor_attr->nr][0]; newkey[1] = '0' + sensor_attr->index; newkey[2] = fan_speed_keys[sensor_attr->nr][2]; newkey[3] = fan_speed_keys[sensor_attr->nr][3]; newkey[4] = 0; mutex_lock(&applesmc_lock); buffer[0] = (speed >> 6) & 0xff; buffer[1] = (speed << 2) & 0xff; ret = applesmc_write_key(newkey, buffer, 2); mutex_unlock(&applesmc_lock); if (ret) return ret; else return count;}static ssize_t applesmc_show_fan_manual(struct device *dev, struct device_attribute *devattr, char *sysfsbuf){ int ret; u16 manual = 0; u8 buffer[2]; struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); mutex_lock(&applesmc_lock); ret = applesmc_read_key(FANS_MANUAL, buffer, 2); manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01; mutex_unlock(&applesmc_lock); if (ret) return ret; else return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", manual);}static ssize_t applesmc_store_fan_manual(struct device *dev, struct device_attribute *devattr, const char *sysfsbuf, size_t count){ int ret; u8 buffer[2]; u32 input; u16 val; struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); input = simple_strtoul(sysfsbuf, NULL, 10); mutex_lock(&applesmc_lock); ret = applesmc_read_key(FANS_MANUAL, buffer, 2); val = (buffer[0] << 8 | buffer[1]); if (ret) goto out; if (input) val = val | (0x01 << attr->index); else val = val & ~(0x01 << attr->index); buffer[0] = (val >> 8) & 0xFF; buffer[1] = val & 0xFF; ret = applesmc_write_key(FANS_MANUAL, buffer, 2);out: mutex_unlock(&applesmc_lock); if (ret) return ret; else return count;}static ssize_t applesmc_show_fan_position(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ int ret; char newkey[5]; u8 buffer[17]; struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr); newkey[0] = FAN_POSITION[0]; newkey[1] = '0' + sensor_attr->index; newkey[2] = FAN_POSITION[2]; newkey[3] = FAN_POSITION[3]; newkey[4] = 0; mutex_lock(&applesmc_lock); ret = applesmc_read_key(newkey, buffer, 16); buffer[16] = 0; mutex_unlock(&applesmc_lock); if (ret) return ret; else return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", buffer+4);}static ssize_t applesmc_calibrate_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", rest_x, rest_y);}static ssize_t applesmc_calibrate_store(struct device *dev, struct device_attribute *attr, const char *sysfsbuf, size_t count){ mutex_lock(&applesmc_lock); applesmc_calibrate(); mutex_unlock(&applesmc_lock); return count;}/* Store the next backlight value to be written by the work */static unsigned int backlight_value;static void applesmc_backlight_set(struct work_struct *work){ u8 buffer[2]; mutex_lock(&applesmc_lock); buffer[0] = backlight_value; buffer[1] = 0x00; applesmc_write_key(BACKLIGHT_KEY, buffer, 2); mutex_unlock(&applesmc_lock);}static DECLARE_WORK(backlight_work, &applesmc_backlight_set);static void applesmc_brightness_set(struct led_classdev *led_cdev, enum led_brightness value){ int ret; backlight_value = value; ret = queue_work(applesmc_led_wq, &backlight_work); if (debug && (!ret)) printk(KERN_DEBUG "applesmc: work was already on the queue.\n");}static ssize_t applesmc_key_count_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ int ret; u8 buffer[4]; u32 count; mutex_lock(&applesmc_lock); ret = applesmc_read_key(KEY_COUNT_KEY, buffer, 4); count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) + ((u32)buffer[2]<<8) + buffer[3]; mutex_unlock(&applesmc_lock); if (ret) return ret; else return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", count);}static ssize_t applesmc_key_at_index_read_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ char key[5]; char info[6]; int ret; mutex_lock(&applesmc_lock); ret = applesmc_get_key_at_index(key_at_index, key); if (ret || !key[0]) { mutex_unlock(&applesmc_lock); return -EINVAL; } ret = applesmc_get_key_type(key, info); if (ret) { mutex_unlock(&applesmc_lock); return ret; } /* * info[0] maximum value (APPLESMC_MAX_DATA_LENGTH) is much lower than * PAGE_SIZE, so we don't need any checks before writing to sysfsbuf. */ ret = applesmc_read_key(key, sysfsbuf, info[0]); mutex_unlock(&applesmc_lock); if (!ret) { return info[0]; } else { return ret; }}static ssize_t applesmc_key_at_index_data_length_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ char key[5]; char info[6]; int ret; mutex_lock(&applesmc_lock); ret = applesmc_get_key_at_index(key_at_index, key); if (ret || !key[0]) { mutex_unlock(&applesmc_lock); return -EINVAL; } ret = applesmc_get_key_type(key, info); mutex_unlock(&applesmc_lock); if (!ret) return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", info[0]); else return ret;}static ssize_t applesmc_key_at_index_type_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ char key[5]; char info[6]; int ret; mutex_lock(&applesmc_lock); ret = applesmc_get_key_at_index(key_at_index, key); if (ret || !key[0]) { mutex_unlock(&applesmc_lock); return -EINVAL; } ret = applesmc_get_key_type(key, info); mutex_unlock(&applesmc_lock); if (!ret) return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", info+1); else return ret;}static ssize_t applesmc_key_at_index_name_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ char key[5]; int ret; mutex_lock(&applesmc_lock); ret = applesmc_get_key_at_index(key_at_index, key); mutex_unlock(&applesmc_lock); if (!ret && key[0]) return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key); else return -EINVAL;}static ssize_t applesmc_key_at_index_show(struct device *dev, struct device_attribute *attr, char *sysfsbuf){ return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", key_at_index);}static ssize_t applesmc_key_at_index_store(struct device *dev, struct device_attribute *attr, const char *sysfsbuf, size_t count){ mutex_lock(&applesmc_lock); key_at_index = simple_strtoul(sysfsbuf, NULL, 10); mutex_unlock(&applesmc_lock); return count;}static struct led_classdev applesmc_backlight = { .name = "smc:kbd_backlight", .default_trigger = "nand-disk", .brightness_set = applesmc_brightness_set,};static DEVICE_ATTR(name, 0444, applesmc_name_show, NULL);static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);static DEVICE_ATTR(calibrate, 0644, applesmc_calibrate_show, applesmc_calibrate_store);static struct attribute *accelerometer_attributes[] = { &dev_attr_position.attr, &dev_attr_calibrate.attr, NULL};static const struct attribute_group accelerometer_attributes_group = { .attrs = accelerometer_attributes };static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);static DEVICE_ATTR(key_count, 0444, applesmc_key_count_show, NULL);static DEVICE_ATTR(key_at_index, 0644, applesmc_key_at_index_show, applesmc_key_at_index_store);static DEVICE_ATTR(key_at_index_name, 0444, applesmc_key_at_index_name_show, NULL);static DEVICE_ATTR(key_at_index_type, 0444, applesmc_key_at_index_type_show, NULL);static DEVICE_ATTR(key_at_index_data_length, 0444, applesmc_key_at_index_data_length_show, NULL);static DEVICE_ATTR(key_at_index_data, 0444, applesmc_key_at_index_read_show, NULL);static struct attribute *key_enumeration_attributes[] = { &dev_attr_key_count.attr, &dev_attr_key_at_index.attr, &dev_attr_key_at_index_name.attr, &dev_attr_key_at_index_type.attr, &dev_attr_key_at_index_data_length.attr, &dev_attr_key_at_index_data.attr, NULL};static const struct attribute_group key_enumeration_group = { .attrs = key_enumeration_attributes };/* * Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -