小编whh*_*000的帖子

如何进行TRUE重新扫描PCIe总线

在我的Linux内核进行初始PCIe总线扫描和枚举之后,我有一个FPGA(就像大多数人问这个问题一样).您可以猜到,FPGA实现了PCIe端点.

我想让PCIe核心重新枚举整个PCIe总线,这样我的FPGA就会出现,我可以加载我的驱动模块.我还希望能够为不同的配置交换FPGA负载.我的意思是,我希望能够:

  1. 启动Linux
  2. 配置FPGA
  3. 枚举PCIe端点和加载模块
  4. 删除PCIe端点
  5. 重新配置FPGA
  6. 重新枚举PCIe端点

所有这些都没有重启Linux

以下是其他地方提出的解决方案,但没有解决问题.

echo 1 > /sys/bus/pci/rescan 这似乎有效(仅在某些情况下),如果我想在首次枚举后热插拔FPGA负载,它就无法工作.

这是一个相当侵入性的方法(我没有测试过),也有人在其他地方提出过.https://community.freescale.com/thread/305355

可以使用PCIe的Hotplug /电源管理设施来完成这项工作吗?如果是这样,有什么好的资源可以用于如何使用PCIe的Hotplug系统?(LDD并没有完全覆盖它)

linux-device-driver linux-kernel hotplugging pci-e

17
推荐指数
2
解决办法
5万
查看次数

如何使用mmap()映射物理内存

我正在尝试访问物理内存地址,0x30000000并且正在尝试使用完成此操作mmap()。当我将此地址映射到虚拟地址指针时,无法从内存中读取正确的值。当我使用调试器(带JTAG的TI Code Composer Studio)查看内存时,可以看到内存中的值,但是我的代码中没有相同的值吗?我使用mmap()正确吗?

off_t          dev_base = 0x30000000;
size_t         ldev = 0x3FFFFFF;
int offset = 0x00;


memfd = open("/dev/mem", O_RDWR | O_SYNC);
mapped_base = (int*)mmap(0, ldev, PROT_READ|PROT_WRITE, MAP_SHARED, memfd, dev_base);

if (mapped_base == MAP_FAILED)
{
    errx(1, "mmap failure");
}

printf("mapped_base = %08p\n", mapped_base);


printf("The value at address [%08p] = %08p\n", offset + ((int)mapped_base), mapped_base[offset/4]);

munmap(mapped_base, ldev);
close(memfd);
Run Code Online (Sandbox Code Playgroud)

linux mmap virtual-memory linux-device-driver

5
推荐指数
1
解决办法
2379
查看次数

平台设备/字符设备的 struct 类和 sysfs

我创建了一个平台设备驱动程序,它在启动时从设备树中初始化。我希望能够作为字符驱动程序访问该设备,并试图找出我应该使用哪些结构条目。

基本上我希望我的设备(在设备树中使用从 开始的资源)0x34000000在 中显示为 char 设备/dev/myDevice

为此,我知道我需要使用dev_t. 1)我可以在platform_device->dev.devt中使用dev_t吗?如果可以,我还需要调用`alloc_chrdev_region'还是由内核预先初始化?

目前我使用它,我仍然调用alloc_chrdev_region它来初始化它,然后我调用cdev_init/cdev_add创建我的字符设备。

现在我的设备在 /dev 中显示为 /dev/34000000.myDevice。

2)为什么前面会显示它的内存资源?

在做了一些阅读之后,我决定尝试创建一个新类和一个新设备(这似乎不对),以便获得一个/dev/myDevice条目。

我看到有一个struct class *字段platform_device->dev.class

3)我需要初始化这个字段还是由内核预先初始化?

device_create4)当我已经初始化了设备时,为什么我需要使用新的“结构类”进行调用( struct platform_device->dev

dev_tcdev、之间的联系class以及它们与 的关系platform_device对我来说有点像迷宫。如果有人能帮忙解释一下,那就太好了。

linux-device-driver linux-kernel

5
推荐指数
0
解决办法
1276
查看次数

mmap /dev/mem 时的缓存和易失性内存

我有一个在内核中分配的硬件缓冲区。该缓冲区从 PCIe 总线接收 DMA 数据。然后,我使用从用户空间将硬件缓冲区映射到我的虚拟地址空间mmap /dev/mem。我的问题如下:

1)如何mmap处理缓存?

a)从阅读中mmap我了解到,当从用户空间写入映射区域时,我可能需要调用 msync 将内存的缓存版本刷新到“文件”中。由于/dev/mem实现方式与mmaped文件不同,我还需要msync写入吗?

b) 由于我映射的内存是volatile内存(DMA 硬件写入它),我如何保持从该内存读取的同步?如果物理内存中的硬件发生了更改,那么我已从用户空间将更改写入了缓存,然后我进行了msync刷新写入的更改,物理内存更改是否由于我用刷新过度写入而丢失?

c)mmaping /dev/mem我什么时候应该将返回的虚拟内存指针声明为volatile

我看到很多关于mmap缓存的文档,因为它涉及mmaping文件系统文件(不是易失性内存),但是当涉及到时,mmaping /dev/mem我似乎无法获得相同的信息(我猜它可能都是相同的)。

linux memory caching mmap linux-kernel

5
推荐指数
1
解决办法
2291
查看次数