在我的Linux内核进行初始PCIe总线扫描和枚举之后,我有一个FPGA(就像大多数人问这个问题一样).您可以猜到,FPGA实现了PCIe端点.
我想让PCIe核心重新枚举整个PCIe总线,这样我的FPGA就会出现,我可以加载我的驱动模块.我还希望能够为不同的配置交换FPGA负载.我的意思是,我希望能够:
所有这些都没有重启Linux
以下是其他地方提出的解决方案,但没有解决问题.
echo 1 > /sys/bus/pci/rescan 这似乎有效(仅在某些情况下),如果我想在首次枚举后热插拔FPGA负载,它就无法工作.
这是一个相当侵入性的方法(我没有测试过),也有人在其他地方提出过.https://community.freescale.com/thread/305355
可以使用PCIe的Hotplug /电源管理设施来完成这项工作吗?如果是这样,有什么好的资源可以用于如何使用PCIe的Hotplug系统?(LDD并没有完全覆盖它)
我正在尝试访问物理内存地址,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) 我创建了一个平台设备驱动程序,它在启动时从设备树中初始化。我希望能够作为字符驱动程序访问该设备,并试图找出我应该使用哪些结构条目。
基本上我希望我的设备(在设备树中使用从 开始的资源)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_t、cdev、之间的联系class以及它们与 的关系platform_device对我来说有点像迷宫。如果有人能帮忙解释一下,那就太好了。
我有一个在内核中分配的硬件缓冲区。该缓冲区从 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我似乎无法获得相同的信息(我猜它可能都是相同的)。