Linux kernel 在linux设备驱动程序中读取配置文件

Linux kernel 在linux设备驱动程序中读取配置文件,linux-kernel,config,linux-device-driver,Linux Kernel,Config,Linux Device Driver,如何读取linux设备驱动程序中的配置文件?专家们说,在内核空间读写文件是一种糟糕的做法。对于固件下载,我们有请求固件内核API。是否有用于读取和解析驱动程序配置文件的linux内核API?例如:读取特定驱动程序的波特率和固件文件路径。大多数情况下,不鼓励从内核空间执行文件i/o,但如果您仍然希望从内核空间读取文件,内核提供了一个很好的接口来打开和读取内核中的文件。下面是一个示例模块 /* * read_file.c - A Module to read a file from Kerne

如何读取linux设备驱动程序中的配置文件?专家们说,在内核空间读写文件是一种糟糕的做法。对于固件下载,我们有请求固件内核API。是否有用于读取和解析驱动程序配置文件的linux内核API?例如:读取特定驱动程序的波特率和固件文件路径。

大多数情况下,不鼓励从内核空间执行文件i/o,但如果您仍然希望从内核空间读取文件,内核提供了一个很好的接口来打开和读取内核中的文件。下面是一个示例模块

 /*
  * read_file.c - A Module to read a file from Kernel Space
  */
 #include <linux/module.h>
 #include <linux/fs.h>

 #define PATH "/home/knare/test.c"
 int mod_init(void)
 {
       struct file *fp;
       char buf[512];
       int offset = 0;
       int ret, i;


       /*open the file in read mode*/
       fp = filp_open(PATH, O_RDONLY, 0);
       if (IS_ERR(fp)) {
            printk("Cannot open the file %ld\n", PTR_ERR(fp));
            return -1;
       }

       printk("Opened the file successfully\n");
       /*Read the data to the end of the file*/
       while (1) {
            ret = kernel_read(fp, offset, buf, 512);
            if (ret > 0) {
                    for (i = 0; i < ret; i++)
                            printk("%c", buf[i]);
                    offset += ret;
            } else
                    break;
        }

       filp_close(fp, NULL);
       return 0;
  }

  void mod_exit(void)
  {

  }

  module_init(mod_init); 
  module_exit(mod_exit);

 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Knare Technologies (www.knare.org)");
 MODULE_DESCRIPTION("Module to read a file from kernel space");    
/*
*read_file.c—从内核空间读取文件的模块
*/
#包括
#包括
#定义路径“/home/knare/test.c”
int mod_init(无效)
{
结构文件*fp;
char-buf[512];
整数偏移=0;
int ret,i;
/*以读取模式打开文件*/
fp=filp_open(路径,O_RDONLY,0);
如果(是错误(fp)){
printk(“无法打开文件%ld\n”,PTR_ERR(fp));
返回-1;
}
printk(“成功打开文件\n”);
/*将数据读取到文件末尾*/
而(1){
ret=内核读取(fp,偏移量,buf,512);
如果(ret>0){
对于(i=0;i
我在linux-3.2内核上测试了这个模块。我使用了printk()函数
打印数据,但这不是您的实际情况,这只是一个示例

配置设备的方法有很多,例如自动配置、
ioctl
s或模块参数。你到底想配置什么?我正在开发一个与UART交互的驱动程序。需要将波特率和固件文件位置设置为驱动模块的可配置参数。我想探索是否有一个内核接口用于此目的。