标签: linux-device-driver

如何在Linux中读取扩展的PCIE配置空间?

我已经尝试在/ proc/bus/pci目录下读取用户空间pci条目并在驱动程序中调用内核空间API pci_read_config_word().但似乎两者都只能读取pci基本配置空间,偏移量小于0x100.

我想要读取的偏移量超过0x100,有人能告诉我如何在Linux中执行此操作吗?如果在内核空间中完成,那么告诉哪个API会非常感激.非常感谢你!

linux linux-device-driver linux-kernel pci

2
推荐指数
1
解决办法
9632
查看次数

为什么当我使用copy_from_user时,一些模糊的字符添加到原始缓冲区?

我在内核模块中创建了WRITE_IOCTL,并在用户模式下调用它:

ioctl(fd, WRITE_IOCTL, "Hello, Kernel!");
Run Code Online (Sandbox Code Playgroud)

在内核模式中,我有:

static int device_ioctl(struct file *filp,
    unsigned int cmd, unsigned long args) {
  char buff[14];

  switch (cmd) {
  case WRITE_IOCTL:
    copy_from_user( buff,(char *)args, 14);
    printk("This message received from User Space: %s\n", buff);
    break;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个ioctl时,我在/var/log/kern.log中有类似的东西:

This message received from User Space: Hello, Kernel!vE?
This message received from User Space: Hello, Kernel!M?
This message received from User Space: Hello, Kernel!M?
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题??

c kernel kernel-module linux-device-driver linux-kernel

2
推荐指数
1
解决办法
1340
查看次数

'i2c_get_clientdata'和"i2c_set_clientdata"有什么用?

我一直在研究I2C驱动程序(客户端)代码.我在每个地方看过这个函数"i2c_get_clientdata"和"i2c_set_clientdata".

我在这里看到了这个问题. 使用指针结构而不是创建静态本地副本

有时我觉得像"container_of"宏一样得到指向结构的指针.但我仍然没有正确理解为什么要使用它以及何时使用它.

下面我发布一个示例代码,我看到它的用法.如果有人可以帮助我理解为什么在那里使用它,当我们编写自己的驱动程序时我们将使用它.

struct max6875_data {
    struct i2c_client       *fake_client;
    struct mutex            update_lock;

    u32                     valid;
    u8                      data[USER_EEPROM_SIZE];
    unsigned long           last_updated[USER_EEPROM_SLICES];
};

static ssize_t max6875_read(struct file *filp, struct kobject *kobj,
                        struct bin_attribute *bin_attr,
                        char *buf, loff_t off, size_t count)
{
    struct i2c_client *client = kobj_to_i2c_client(kobj);
    struct max6875_data *data = i2c_get_clientdata(client);
    int slice, max_slice;

    if (off > USER_EEPROM_SIZE)
            return 0;

    if (off + count > USER_EEPROM_SIZE)
            count = USER_EEPROM_SIZE - off;

    /* refresh slices which contain requested bytes */
    max_slice = …
Run Code Online (Sandbox Code Playgroud)

i2c linux-device-driver linux-kernel embedded-linux

2
推荐指数
1
解决办法
4076
查看次数

为什么有些代码调用request_threaded_irq并将NULL作为irq_handler的参数?

根据内核文档,request_threaded_irq用于将其分为两部分,irq_handler检查中断是否源自设备.如果是,则需要禁用设备上的中断并返回IRQ_WAKE_THREAD,这将唤醒处理程序线程并运行@thread_fn.

但我发现了一些代码寄存器中断,request_threaded_irq在传递时使用NULL,irq_handler并且它们保持完整的功能thread_fn.

所以我怀疑是为什么我们request_threaded_irq()在这种情况下使用,而我们可以轻松使用request_irq,其行为与上述场景相同.

kernel interrupt linux-device-driver linux-kernel

2
推荐指数
1
解决办法
535
查看次数

简单休眠(使用wait_event _*()函数)和高级休眠(使用prepare_to_wait()函数)有什么区别?

在LDD3一书中,它介绍了简单的休眠(wait_event*()函数)和提前休眠(prepare_to_wait()函数).

如果我的理解是正确的,那么wait_queue_t似乎是一个进程条目,但wait_queue_head_t似乎是等待队列来存储正在添加(wait_queue_t)的进程列表.

因此,令我感到困惑的是,我应该使用wait_event _*()函数与prepare_to_wait使用指定等待进程的情况.

我能告诉的唯一原因是我可以在睡觉前指定过程状态与简单睡眠.但是,简单的睡眠确实提供了可中断和不间断的wait_event功能.

所以,我有点困惑为什么从设计和实现的角度来看我们都需要两个.谢谢.

linux-device-driver linux-kernel embedded-linux

2
推荐指数
1
解决办法
1866
查看次数

ALSA vs PulseAudio - 延迟问题

美好的一天,

我一直在与一位同事就ALSA与PulseAudio进行辩论,并需要一些帮助才能得出结论.据我所知,ALSA相对较低,直接与硬件对话,而PulseAudio作为服务位于ALSA之上.

另外,据我所知,ALSA与Linux有关,但PulseAudio只是作为ALSA之上的抽象层,可以在其他平台上运行.我的结论是ALSA会在大多数Linux系统上提供较低的音频延迟,而我的同事认为PulseAudio提供更好(更短)的延迟.

我们哪个是正确的?我的理由是,由于PulseAudio位于ALSA之上或甚至包裹它,除非它提供自己的低级别调用,否则它无法提供更好的延迟.

谢谢.

linux audio alsa linux-device-driver pulseaudio

2
推荐指数
1
解决办法
3628
查看次数

是java本机接口方法和模块名称的命名约定吗?

我能够很好地遵循jni教程.但是当我改变方法名称时,我遇到了麻烦.我需要遵循命名约定吗?本教程使用HelloJNI作为模块名称和库名称.我用过"useaaacom".

我得到了很好的反馈,我正在取得进展.我有一个相关的问题; 如果我应该为它创建另一个帖子,请告诉我.我喜欢在此应用程序上构建,此应用程序在此时运行.如何从设备驱动程序调用函数?我有头文件,驱动程序加载到我的图像.根据"我的意思",我是否需要在项目中获得头文件的副本?此设备驱动程序是供应商实现的,即它不是AOSP的一部分.自从我下载整个开源项目并构建它以来,我确实有它的副本.所以我要问的是我在apk中需要什么才能让app调用属于活动设备驱动程序的函数?

让我知道我是否应该更多地解释它的任何部分,或者我需要发布头文件或....

我已经验证我可以使用以下代码行打开设备驱动程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv)
{
/* Our file descriptor */
int fd;
int rc = 0;
char *rd_buf[16];
printf("%s: entered\n", argv[0]);
/* Open the device */
fd = open("/dev/hello1", O_RDWR);
if ( fd == -1 ) {
perror("open failed");
rc = fd;
exit(-1);
}
printf("%s: open: successful\n", argv[0]);
/* Issue a read */
rc = read(fd, rd_buf, 0);
if ( rc == …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface android device-driver linux-device-driver

2
推荐指数
1
解决办法
4396
查看次数

arm archtecture上的dma_map_single内部

我试图了解ARM体系结构的DMA内部,参考内核文档:http://lxr.free-electrons.com/source/Documentation/DMA-API-HOWTO.txt.

我的理解是我们在内核空间中分配内存(使用DMA约束)并将其传递给dma_map_single()函数,该函数将根据DMA需要更改内存的映射属性(写入组合或非高速缓存).然后,如果平台支持IOMMU,它将返回设备总线的虚拟地址,否则它将返回可以直接从设备访问的物理地址.

这是正确的理解吗?

目前,我无法映射它的源代码,任何带有代码片段的指针都会非常有用.

arm memory-management linux-device-driver linux-kernel dma

2
推荐指数
1
解决办法
2160
查看次数

Linux内核模块 - 打开创建的char设备会导致错误

我刚刚开始阅读Ldd3并尝试实现一个简单的模块,或多或少遵循本书中的示例.模块将带有自定义fops(空函数)的char设备添加到内核.模块加载没有问题,但是当我尝试打开设备时,进程被杀死,dmesg打印出调试信息.我的内核是4.8.0.X86-64.这是我的代码

#include <linux/init.h>
#include <linux/module.h>

#include <linux/types.h> // for dev_t
#include <linux/kdev_t.h> // for MAJOR, MINOR macros etc..
#include <linux/fs.h> // for alloc_chrdev_region etc ..
#include <linux/cdev.h> // to register char devic

MODULE_LICENSE("Dual BSD/GPL");

dev_t hello_num;    
struct cdev *my_cdev;

loff_t hello_llseek(struct file *filepo, loff_t offset, int a){
    return 0;
}

int hello_open(struct inode *inode, struct file *flip){
    printk(KERN_ALERT "you opened this device");
    return 0;
}

ssize_t hello_read(struct file *filep, char __user *ptr, size_t sizee, loff_t *gela){
    return 0;
}

ssize_t …
Run Code Online (Sandbox Code Playgroud)

c linux kernel-module linux-device-driver linux-kernel

2
推荐指数
1
解决办法
427
查看次数

内置内核驱动程序还需要设备树吗?

如果我构建一个内核驱动程序module,它可以在运行时使用insmod或modprobe手动插入内核,我很清楚.但是关于设备树的以下陈述是否正确?

  1. 如果我构建一个内核驱动程序,module它将在启动时自动插入内核,具体取决于它是否在设备树中列出
  2. 如果我将内核驱动程序构建为built-in,则无论设备树如何,它都将在引导时自动插入内核

linux kernel linux-device-driver linux-kernel device-tree

2
推荐指数
1
解决办法
873
查看次数