Dalam sesetengah papan pembangunan Linux, anda sering dapat melihat kaedah gema untuk mengawal perkakasan secara langsung atau mengubah suai pemacu, contohnya:
//灯灭 echo 0 >/sys/class/leds/firefly:blue:power/brightness //灯亮 echo 1 >/sys/class/leds/firefly:blue:power/brightness
Bagaimana untuk melakukan ini?
Sebenarnya, ini kerana pemandu menyediakan antara muka sysfs
disediakan kepada pengguna, membenarkan pengguna menggunakan cat
atau echo
arahan untuk melihat dan mengubah suai nilai pembolehubah tertentu dalam pemacu. sysfs
接口给用户使用,使得用户可以通过cat
或者echo
命令来查看和修改驱动中某些变量的值。
下面介绍驱动中创建sysfs接口的方法。
基本步骤:
1、使用DEVICE_ATTR
声明一个sys
节点
static DEVICE_ATTR(led_status, 0600, led_status_show, led_status_store);
led_status
sys
nod🎜static unsigned int led = 0; /* * sys节点的读函数 * 执行 cat /sys/devices/platform/leds/led_status时会调用 */ static ssize_t led_status_show(struct device *dev, struct device_attribute *attr, char *buf) { //buf是通过cat命令显示到终端的内容,这里显示led变量 return sprintf(buf, "%s:%d.\n", "led", led); } /** * sys节点的写函数 * 用echo命令往sys节点写入内容时,会调用该函数 */ static ssize_t led_status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { //写入的内容会存放到buf中,这里将buf内容赋值给led变量 sscanf(buf, "%d", &led); return count; }
led_status
: Nama nod yang dipaparkan dalam antara muka sys🎜0600
:表示操作这个led_status节点的权限
led_status_show
:使用cat
命令查看sys接口时调用的函数
led_status_store
:使用echo
命令往sys接口写入内容时调用的函数
2、完成sys节点的读写函数
static unsigned int led = 0; /* * sys节点的读函数 * 执行 cat /sys/devices/platform/leds/led_status时会调用 */ static ssize_t led_status_show(struct device *dev, struct device_attribute *attr, char *buf) { //buf是通过cat命令显示到终端的内容,这里显示led变量 return sprintf(buf, "%s:%d.\n", "led", led); } /** * sys节点的写函数 * 用echo命令往sys节点写入内容时,会调用该函数 */ static ssize_t led_status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { //写入的内容会存放到buf中,这里将buf内容赋值给led变量 sscanf(buf, "%d", &led); return count; }
示例中,led_status_show()
函数和led_status_store()
函数的作用分为打印led变量的值和修改led变量的值.
3、定义struct attribute
和struct attribute_group
数组
static struct attribute *led_attributes[]={ /*上述使用了DEVICE_ATTR声明节点名字为led_status, * 则struct attribute名字应为: * dev_attr_ + (节点名) + .attr * 所以名字为dev_attr_led_status.attr */ &dev_attr_led_status.attr, NULL, }; static const struct attribute_group led_attrs={ .attrs = led_attributes,//引用上述struct attribute数组 };
上述使用了DEVICE_ATTR
声明节点名字为led_status
,
则struct attribute
名字应为:dev_attr_ + (节点名) + .attr
。所以名字为dev_attr_led_status.attr
。
4、在probe函数中调用sysfs_create_group()
函数注册sysfs
接口
设备树:
leds:leds{ compatible = "xx,xx-led"; };
驱动:
static unsigned int led = 0; static ssize_t led_status_show(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%s:%d.\n", "led", led); } static ssize_t led_status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { sscanf(buf, "%d", &led); return count; } static DEVICE_ATTR(led_status, 0600, led_status_show, led_status_store); static struct attribute *led_attributes[]={ &dev_attr_led_status.attr, NULL, }; static const struct attribute_group led_attrs={ .attrs = led_attributes, }; static int xx_led_probe(struct platform_device *pdev) { sysfs_create_group(&pdev->dev.kobj, &led_attrs); return 0; } static int xx_led_remove(struct platform_device *pdev) { sysfs_remove_group(&pdev->dev.kobj, &led_attrs); return 0; } static const struct of_device_id xx_led_of_match[] = { {.compatible = "xx,xx-led"}, }; static struct platform_driver xx_led_driver = { .probe = xx_led_probe, .remove = xx_led_remove, .driver = { .name = "xx-led", .owner = THIS_MODULE, .of_match_table = xx_led_of_match, }, }; static int __init xx_led_init(void) { return platform_driver_register(&xx_led_driver ); } static void __exit xx_led_exit(void) { platform_driver_unregister(&xx_led_driver); } module_init(xx_led_init); module_exit(xx_led_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("xx led driver"); MODULE_AUTHOR("Vincent"); MODULE_VERSION("V1.0.00");
驱动加载后,就可以在linux终端中,使用cat
和echo
命令来查看和修改驱动中led
变量的值。例如:
//查看led变量的值 cat /sys/devices/platform/leds/led_status led:0. //修改led变量的值为9 echo 9 > /sys/devices/platform/leds/led_status //查看 cat /sys/devices/platform/leds/led_status led:9.
Atas ialah kandungan terperinci Pemacu Linux |. Cipta antara muka sysfs dalam pemacu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!