[英]Linux Kernel Module : Problem with kernel_write function
我在為 Linux 4.14.73 版本開發 LKM 時使用kernel_write
函數時遇到問題。
這是我面臨問題的模塊的一部分:
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通常為負值。 我想應該是積極的。 請問這個功能有什么問題嗎? 我該如何糾正它?
有關更多信息,我有相同的代碼,但在用戶空間程序中,並且工作正常,我只想將其替換為內核空間。 這是用戶空間程序:
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 功能,它正在工作。 我犯了什么錯誤?
在你的電話中:
rk = kernel_write(f_led, led_value, len, &f_led->f_pos);
第二個參數應該是一個char *
,但你傳遞的是一個int
。
此外,當寫入“/sys/class/leds/[device]/brightness”文件時,處理這個的代碼需要一個指向十進制數字字符串的指針,由一些非數字字符(例如換行符)終止) 或空終止符。
您需要將led_value
作為十進制數“打印”到char
數組,並將數組內容寫入文件:
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
的調用。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.