(十三)Linux sysfs device_attribute

/***************************************************************************                        
 *                    Linux sysfs device_attribute
 * 声明:                                                                                        
 *     本文主要是记录linux驱动中如何在sysfs中生成设备属性。
 *                                                                                                            
 **************************************************************************/                        
                                                                                                    
                                                                                                    
static ssize_t show_firmware_version(struct device *dev,            <----------+                    
        struct device_attribute *attr, char *buf)                              |                    
{                                                                              |                    
    struct bq27x00_device_info *di = dev_get_drvdata(dev);                     |                    
    int ver;                                                                   |                    
                                                                               |                    
    ver = bq27x00_battery_read_fw_version(di);                                 |                    
                                                                               |                    
    return sprintf(buf, "%d\n", ver);                                          |                    
}                                                                              |                    
                                                                               |                    
static ssize_t show_dataflash_version(struct device *dev,           <----------*-+                  
        struct device_attribute *attr, char *buf)                              | |                  
{                                                                              | |                  
    struct bq27x00_device_info *di = dev_get_drvdata(dev);                     | |                  
    int ver;                                                                   | |                  
                                                                               | |                  
    ver = bq27x00_battery_read_dataflash_version(di);                          | |                  
                                                                               | |                  
    return sprintf(buf, "%d\n", ver);                                          | |                  
}                                                                              | |                  
                                                                               | |                  
static ssize_t show_device_type(struct device *dev,                <-----------*-*-+                
        struct device_attribute *attr, char *buf)                              | | |                
{                                                                              | | |                
    struct bq27x00_device_info *di = dev_get_drvdata(dev);                     | | |                
    int dev_type;                                                              | | |                
                                                                               | | |                
    dev_type = bq27x00_battery_read_device_type(di);                           | | |                
                                                                               | | |                
    return sprintf(buf, "%d\n", dev_type);                                     | | |                
}                                                                              | | |                
                                                                               | | |                
static ssize_t show_reset(struct device *dev,                       <----------*-*-*-+              
        struct device_attribute *attr, char *buf)                              | | | |              
{                                                                              | | | |              
    struct bq27x00_device_info *di = dev_get_drvdata(dev);                     | | | |              
                                                                               | | | |              
    bq27x00_battery_reset(di);                                                 | | | |              
                                                                               | | | |              
    return sprintf(buf, "okay\n");                                             | | | |              
}                                                                              | | | |              
                                                                               | | | |              
static DEVICE_ATTR(fw_version, S_IRUGO, show_firmware_version, NULL);   <------+ | | |              
static DEVICE_ATTR(df_version, S_IRUGO, show_dataflash_version, NULL);  <------|-+ | |              
static DEVICE_ATTR(device_type, S_IRUGO, show_device_type, NULL);       <------|-|-+ |              
static DEVICE_ATTR(reset, S_IRUGO, show_reset, NULL);                   <------|-|-|-+              
                                                                               | | | |              
static struct attribute *bq27x00_attributes[] = {              <---------+     | | | |              
    &dev_attr_fw_version.attr,                                  ---------*-----+ | | |              
    &dev_attr_df_version.attr,                                  ---------*-------+ | |              
    &dev_attr_device_type.attr,                                 ---------*---------+ |              
    &dev_attr_reset.attr,                                       ---------*-----------+              
    NULL                                                                 |                          
};                                                                       |                          
                                                                         |                          
static const struct attribute_group bq27x00_attr_group = {     <---------*------+                   
    .attrs = bq27x00_attributes,                                   ------+      |                   
};                                                                              |                   
                                                                                |                   
static int __init bq27x00_battery_probe(struct i2c_client *client,              |                   
                 const struct i2c_device_id *id)                                |                   
{                                                                               |                   
    ......                                                                      |                   
    retval = sysfs_create_group(&client->dev.kobj, &bq27x00_attr_group); -------+                   
    if (retval)                                                                                     
        dev_err(&client->dev, "could not create sysfs files\n");                                    
                                                                                                    
    return 0;                                                                                       
    ......
}                                                                                                   

/**
 *  root@android:/sys/bus/i2c/devices/2-0055 # ls
 *  device_type
 *  df_version
 *  driver
 *  fw_version
 *  modalias
 *  name
 *  power
 *  power_supply
 *  reset
 *  subsystem
 *  uevent
 *  root@android:/sys/bus/i2c/devices/2-0055 # 
 */

猜你喜欢

转载自www.cnblogs.com/zhangshenghui/p/11405893.html