⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 applesmc.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -