天天看点

openBMC source code

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) 

下一篇: syslog

继续阅读