使用DEVICE_ATTR,可以在sys fs中添加“文件”,通過修改該文件內容,可以實現在運行過程中動態控制device的目的。
這樣方便用戶空間調試。
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/mutex.h>
#include <linux/sysfs.h>
#include <linux/mod_devicetable.h>
#include <linux/log2.h>
#include <linux/bitops.h>
#include <linux/jiffies.h>
#include <linux/of.h>
#include <linux/acpi.h>
#include <linux/i2c.h>
#include <linux/platform_data/at24.h>
static struct kobject *spi_obj;
static ssize_t cmd_show(struct device *dev,struct device_attribute *attr, char *buf)
{
printk("cmd show.............\n");
return 1;
}
static ssize_t cmd_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{
printk("cmd store......\n");
return 1;
}
/*
DEVICE_ATTR(_name, _mode, _show, _store)
_name:名稱,也就是將在sys fs中生成的文件名稱。
_mode:上述文件的訪問權限,與普通文件相同,UGO的格式。
_show:顯示函數,cat該文件時,此函數被調用。
_store:寫函數,echo內容到該文件時,此函數被調用。
*/
static DEVICE_ATTR(liu, (S_IRUGO|S_IWUSR), cmd_show, cmd_store);
int spi_init_sysfs(void)
{
spi_obj = kobject_create_and_add("spi-debug", NULL);
int ret = 0;
if (!spi_obj) {
printk(KERN_ALERT "create sysfs object failed.\n");
return -1;
}
ret = sysfs_create_file(spi_obj, &dev_attr_liu.attr);
if (ret) {
printk(KERN_ALERT "create sysfs cmd file failed.\n");
return -1;
}
return 0;
}
void spi_remove_sysfs(void)
{
sysfs_remove_file(spi_obj, &dev_attr_liu.attr);
kobject_del(spi_obj);
}
static int __init spi_dbg_init(void)
{
int ret;
ret = spi_init_sysfs();
if(ret == 0) {
printk(KERN_ERR "spi_dbg_init inti ok.............................\n ");
}else {
printk(KERN_ERR "kobject_create_and_add error....................................\n");
spi_remove_sysfs();
}
return ret;
}
static void __exit spi_dbg_exit(void)
{
spi_remove_sysfs();
}
module_init(spi_dbg_init);
module_exit(spi_dbg_exit);
MODULE_AUTHOR("liu");
MODULE_LICENSE("GPL");