gpt4 book ai didi

linux - 内核驱动程序 - ZedBoard - Linux 在访问地址后挂起

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:04 25 4
gpt4 key购买 nike

我是新 ZedBoard。我的 ZedBoard 在 Xilinx Linux 2015.4 上运行(手动编译的 devicetree.dtb、boot.bin 和 uImage;其他文件来自带有预编译系统的原始存档)。我仅使用 PS、AXI GPIO 和 LED 创建非常简单的 FPGA 配置。在 Vivado 地址中,我可以看到这一行:

Cell       Slave Interface Base name Offset addr. Range High addr.
axi_gpio_0 S_AXI Reg 0x4120_0000 64K 0x4120_FFFF

我想为此 FPGA 配置创建自己的内核驱动程序,但是当我尝试将驱动程序插入系统时,Linux 在 ioread/iowrite 操作开始时挂起。有关于init函数的代码:

#define DEV_NAME "my_led_dev"

dev_t dev_numbers;
struct cdev *my_led_cdev;
static unsigned long gpio_base = 0x41200000;
struct resource *res;


static int led_init(void) {
void* kernel_gpio_base;

/* Device registration */
int state;
if ((state = alloc_chrdev_region(&dev_numbers, 0, 1, DEV_NAME)) != 0)
printk(KERN_ALERT "failed to register a region dynamically\n");
else
printk(KERN_ALERT "major number = %d\n", MAJOR(dev_numbers));

my_led_cdev = cdev_alloc();
my_led_cdev->owner = THIS_MODULE;

state = cdev_add(my_led_cdev, dev_numbers, 1);
if(state < 0) {
printk(KERN_ALERT "device failed to be added\n");
unregister_chrdev_region(dev_numbers, 1);
return -ENODEV;
}
printk (KERN_INFO "Device prepared\n");

/* Get required resources. */
res = request_mem_region(gpio_base, 0xFFFF, "my_gpio_led");
if (res == NULL) {
printk(KERN_ALERT "my_gpio: can't get I/O port address 0x%lx\n", gpio_base);
return -ENODEV;
}

/* Port mapping */
kernel_gpio_base = (void*) ioremap(gpio_base, 0xFFFF);
if (kernel_gpio_base == NULL) {
printk(KERN_ALERT "kernel remap my_gpio failed 0x%lx\n", gpio_base);
release_mem_region (res->start, 65536);
cdev_del(my_led_cdev);
unregister_chrdev_region(dev_numbers, 1);
return -ENODEV;
}
printk (KERN_INFO "Ports mapped\n");

printk (KERN_INFO "Mapped port: %p", kernel_gpio_base);
printk (KERN_INFO "Actual value: %d\n", ioread32 (kernel_gpio_base)); // There is problem. This message isn't printed and system hangs.
iowrite8 (0xff, kernel_gpio_base);

return 0;
}

我看过 Xilinx 和 ZedBoard 文档,但没有结果。我发现很少有关于在赛灵思上插入模块后挂起的主题,但问题出在禁用 fclk-enable 的设备树上。实际上,我使用默认 DT 而不做任何更改,并且 fclk-enable 的值为 <0xf>。

感谢您的帮助。提前致谢。

最佳答案

如果 CPU 向可编程逻辑发出内存事务并且没有响应,则 CPU 将挂起。没有内置的总线错误或超时机制。

以下是我遇到此问题的一些原因:

  1. 可编程逻辑不编程
  2. AXI 从机没有响应正确的地址
  3. AXI 从机中的错误

对此进行调试的一种方法是使用集成逻辑分析器来跟踪 AXI 接口(interface)。

关于linux - 内核驱动程序 - ZedBoard - Linux 在访问地址后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36500554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com