1、fand
1)main函數
read_sysfs_int("/sys/bus/i2c/drivers/cmmcpld/13-003e/slotid", &sysfs_value)
write_fan_speed(fan + fan_offset, fan_speed)
write_fan_led(fan + fan_offset, FAN_LED_BLUE)
start_watchdog(0)
while(1){
critical_temp = read_critical_max_temp();
alarm_temp = read_alarm_max_temp();
raising_pwm = calculate_raising_fan_pwm(critical_temp);
falling_pwm = calculate_falling_fan_pwm(critical_temp);
write_fan_led(fan + fan_offset, FAN_LED_RED);
}
2)write_fan_speed
int write_fan_speed(const int fan, const int value) {
int unit = value * PWM_UNIT_MAX / 100;
if (unit == PWM_UNIT_MAX)
unit--;
return galaxy100_set_fan_sysfs(fan, unit);
3)galaxy100_set_fan_sysfs
info = &galaxy100_fantray_info[fan];
channel = &info->channel_info;
snprintf(fullpath, PATH_CACHE_SIZE, "%s/%s", channel->prefix, "fantray1_pwm");
ret = write_sysfs_int(fullpath, value);
snprintf(fullpath, PATH_CACHE_SIZE, "%s/%s", channel->prefix, "fantray2_pwm");
snprintf(fullpath, PATH_CACHE_SIZE, "%s/%s", channel->prefix, "fantray3_pwm");
4) write_sysfs_int
int write_sysfs_int(char *sysfs_path, int buffer)
{
int rc = 0;
char writeBuf[PATH_CACHE_SIZE];
snprintf(writeBuf, PATH_CACHE_SIZE, "%d", buffer);
return write_sysfs_raw(sysfs_path, writeBuf);
int write_sysfs_raw_internal(const char *device, char *value, int log)
fp = fopen(device, "w");
rc = fputs(value, fp);
fclose(fp);
5) fancpld_attr_table
static int fancpld_probe(struct i2c_client *client,
const struct i2c_device_id *id)
int n_attrs = sizeof(fancpld_attr_table) / sizeof(fancpld_attr_table[0]);
return i2c_dev_sysfs_data_init(client, &fancpld_data,
fancpld_attr_table, n_attrs);
static struct i2c_driver fancpld_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.name = "fancpld",
},
.probe = fancpld_probe,
.remove = fancpld_remove,
.id_table = fancpld_id,
.detect = fancpld_detect,
.address_list = normal_i2c,
};
static int __init fancpld_mod_init(void)
return i2c_add_driver(&fancpld_driver);
6) i2c_dev_sysfs_store
if (dev_attr->ida_store != I2C_DEV_ATTR_STORE_DEFAULT) {
return dev_attr->ida_store(dev, attr, buf, count);
/* default handling, first read back the current value */
val = i2c_smbus_read_byte_data(client, dev_attr->ida_reg);
/* mask out all bits for the value requested */
val &= ~(req_val_mask << dev_attr->ida_bit_offset);
val |= req_val << dev_attr->ida_bit_offset;
val = i2c_smbus_write_byte_data(client, dev_attr->ida_reg, val);
7)module_init
每個檔案對應某個單闆的一個裝置驅動,每個裝置驅動定義一個i2c_dev_attr_st數組,支援使用者态通過檔案方式進行讀寫通路。
2、lib_ipmb_handle
1)int pal_read_cpu_temp(uint8_t snr_num, float *value)
2) bic_set_gpio(uint8_t slot_id, uint8_t gpio, uint8_t value)
3) void lib_ipmb_handle(unsigned char bus_id,
unsigned char *request, unsigned char req_len,
unsigned char *response, unsigned char *res_len)