首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:kernel_write函数问题

:kernel_write函数问题
EN

Stack Overflow用户
提问于 2019-12-12 14:29:11
回答 1查看 2.2K关注 0票数 0

在为Linux4.14.73版本开发LKM时,我在使用kernel_write函数时遇到了问题。

这是我面临问题的模块中的一部分:

代码语言:javascript
复制
void change_led_state(char *led_path, int led_value)
{


    printk("we are in change_led_state\n");
    size_t len = sizeof(led_value);
    char    lpath[64];
    ssize_t rk=0;

    strncpy(lpath, led_path, sizeof(lpath) - 1);
    lpath[sizeof(lpath) - 1] = '\0';
    f_led = filp_open(lpath, O_WRONLY , 0);

    if (f_led == NULL) {
        printk("Unable to access led\n");
        return;
    }


    rk = kernel_write(f_led, led_value, len, &f_led->f_pos);
    printk("rk = %d\n", rk);
    filp_close(f_led, NULL);
}

rk通常得到一个负值。我想肯定是肯定的。功能有什么问题吗?我怎样才能改正呢?

关于更多的信息,我有相同的代码,但是在用户空间程序中,它运行得很好,我只想把它替换为内核空间。这是用户空间程序:

代码语言:javascript
复制
void change_led_state(char *led_path, int led_value)
{
    char    lpath[64];
    FILE    *led_fd;

    strncpy(lpath, led_path, sizeof(lpath) - 1);
    lpath[sizeof(lpath) - 1] = '\0';

    led_fd = fopen(lpath, "w");

    if (led_fd == NULL) {
        fprintf(stderr, "simplekey: unable to access led\n");
        return;
    }

    fprintf(led_fd, "%d\n", led_value);

    fclose(led_fd);
}


void reset_leds(void)
{
    change_led_state(LED_PATH "/" green "/brightness", 0);
}

void eval_keycode(int code)
{
    static int green_state = 0;

    switch (code) {
    case 260:
        printf("BTN pressed\n");

        // figure out red state
        green_state = green_state ? 0 : 1;

        change_led_state(LED_PATH "/" green "/brightness", green_state);
        break;

    default :
        printf("Wrong Button was pressed\n");
        break;
    }
}

在主要功能中,我只调用eval_keycode函数,它就可以工作了。我犯了什么错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-16 19:16:45

在你的电话里:

代码语言:javascript
复制
    rk = kernel_write(f_led, led_value, len, &f_led->f_pos);

第二个参数应该是一个char *,但是您要传递一个int

此外,当写入“/sys/class/leds/device/亮度”文件时,处理该文件的代码需要一个指向十进制数字字符串的指针,该指针以一些非数字字符(例如新行)或空终止符结束。

您需要将led_value作为十进制数字“打印”到char数组,并将数组内容写入文件:

代码语言:javascript
复制
    char led_valstr[20]; /* should be large enough */

    len = scnprintf(led_valstr, sizeof(led_valstr), "%d\n", led_value);
    rk = kernel_write(f_led, led_valstr, len, &f_led->f_pos);

(编辑:更正了对scnprintf的调用。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59306780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档