Làm cách nào để gỡ lỗi trình điều khiển không liên kết với thiết bị trên Linux?


10

Tôi đang cố gắng tìm hiểu tại sao thiết bị sau không được thiết lập cho trình điều khiển của nó trên Creator CI20 của tôi . Để tham khảo Tôi đang sử dụng kernel Linux v4.13.0 và thực hiện việc biên dịch cục bộ:

make ARCH=mips ci20_defconfig
make -j8 ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- uImage

Từ hệ thống đang chạy, tôi có thể thấy:

ci20@ci20:~# find /sys | grep rng
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/compatible
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/name
/sys/bus/platform/drivers/jz4780-rng
/sys/bus/platform/drivers/jz4780-rng/bind
/sys/bus/platform/drivers/jz4780-rng/unbind
/sys/bus/platform/drivers/jz4780-rng/uevent

Vì vậy, thiết bị được nhìn thấy bởi kernel khi chạy, bây giờ phần còn thiếu là lý do tại sao trình điều khiển không bao giờ bị ràng buộc? Tôi đã mong đợi một cái gì đó như thế này:

/sys/bus/platform/drivers/jz4780-rng/100000d8.rng

Tôi đã tìm thấy một số bài viết khác giải thích cách gỡ lỗi một hệ thống đang chạy, chẳng hạn như:

Mặc dù thông tin là chính xác trên các bài đăng đó, nhưng nó không hữu ích cho tôi. Vì tôi đang xây dựng cục bộ kernel của mình (tôi đã thêm printkvào chức năng thăm dò của jz4780-rngtrình điều khiển), nên câu hỏi của tôi là:

  • Tôi nên bật tùy chọn nào vào thời gian biên dịch để kernel in thông tin chính xác về lỗi không gọi chức năng thăm dò cho jz4780-rngtrình điều khiển?
  • Cụ thể làm thế nào để tôi in danh sách đầy đủ của xe buýt / trình điều khiển được thử nghiệm cho driver_probe_device?

Tôi ổn để thêm printkbất cứ nơi nào trong mã để gỡ lỗi này. Câu hỏi là: chức năng nào đi ngang qua cây thiết bị và gọi chức năng thăm dò / init?

Để tham khảo:

$ dtc -I fs -O dts /sys/firmware/devicetree/base | grep -A 1 rng
              rng@d8 {
                      compatible = "ingenic,jz4780-rng";
              };

chuỗi tương thích được khai báo là:

cgu: jz4780-cgu@10000000 {
    compatible = "ingenic,jz4780-cgu", "syscon";
    reg = <0x10000000 0x100>;

    clocks = <&ext>, <&rtc>;
    clock-names = "ext", "rtc";

    #clock-cells = <1>;

    rng: rng@d8 {
        compatible = "ingenic,jz4780-rng";
    };
};

Và trong trình điều khiển như:

static const struct of_device_id jz4780_rng_dt_match[] = {
    {
        .compatible = "ingenic,jz4780-rng",
    },
    { },
};
MODULE_DEVICE_TABLE(of, jz4780_rng_dt_match);

static struct platform_driver jz4780_rng_driver = {
    .driver     = {
        .name   = "jz4780-rng",
        .of_match_table = jz4780_rng_dt_match,
    },
    .probe      = jz4780_rng_probe,
    .remove     = jz4780_rng_remove,
};
module_platform_driver(jz4780_rng_driver);

Cập nhật1:

Khi tôi xây dựng kernel của mình CONFIG_DEBUG_DRIVER=y, đây là những gì tôi có thể thấy:

# grep driver_probe_device syslog
Sep  6 10:08:07 ci20 kernel: [    0.098280] bus: 'platform': driver_probe_device: matched device 10031000.serial with driver ingenic-uart
Sep  6 10:08:07 ci20 kernel: [    0.098742] bus: 'platform': driver_probe_device: matched device 10033000.serial with driver ingenic-uart
Sep  6 10:08:07 ci20 kernel: [    0.099209] bus: 'platform': driver_probe_device: matched device 10034000.serial with driver ingenic-uart
Sep  6 10:08:07 ci20 kernel: [    0.106945] bus: 'platform': driver_probe_device: matched device 1b000000.nand-controller with driver jz4780-nand
Sep  6 10:08:07 ci20 kernel: [    0.107282] bus: 'platform': driver_probe_device: matched device 134d0000.bch with driver jz4780-bch
Sep  6 10:08:07 ci20 kernel: [    0.107470] bus: 'platform': driver_probe_device: matched device 16000000.dm9000 with driver dm9000
Sep  6 10:08:07 ci20 kernel: [    0.165618] bus: 'platform': driver_probe_device: matched device 10003000.rtc with driver jz4740-rtc
Sep  6 10:08:07 ci20 kernel: [    0.166177] bus: 'platform': driver_probe_device: matched device 10002000.jz4780-watchdog with driver jz4740-wdt
Sep  6 10:08:07 ci20 kernel: [    0.170930] bus: 'platform': driver_probe_device: matched device 1b000000.nand-controller with driver jz4780-nand

Nhưng chỉ:

# grep rng syslog
Sep  6 10:08:07 ci20 kernel: [    0.166842] bus: 'platform': add driver jz4780-rng
Sep  6 10:08:42 ci20 kernel: [   54.584451] random: crng init done

Là một lưu ý phụ, rngnút toplevel: cgukhông được tham chiếu ở đây, nhưng có một jz4780-cgutrình điều khiển.


Cập nhật2:

Nếu tôi di chuyển rngkhai báo nút bên ngoài cgunút toplevel , ít nhất tôi có thể thấy một số ràng buộc xảy ra cuối cùng:

# grep rng /var/log/syslog 
Sep  6 10:30:57 ci20 kernel: [    0.167017] bus: 'platform': add driver jz4780-rng
Sep  6 10:30:57 ci20 kernel: [    0.167033] bus: 'platform': driver_probe_device: matched device 10000000.rng with driver jz4780-rng
Sep  6 10:30:57 ci20 kernel: [    0.167038] bus: 'platform': really_probe: probing driver jz4780-rng with device 10000000.rng
Sep  6 10:30:57 ci20 kernel: [    0.167050] jz4780-rng 10000000.rng: no pinctrl handle
Sep  6 10:30:57 ci20 kernel: [    0.167066] devices_kset: Moving 10000000.rng to end of list
Sep  6 10:30:57 ci20 kernel: [    0.172774] jz4780-rng: probe of 10000000.rng failed with error -22
Sep  6 10:31:32 ci20 kernel: [   54.802794] random: crng init done

Sử dụng:

    rng: rng@100000d8 {
        compatible = "ingenic,jz4780-rng";
    };

Tôi cũng có thể xác minh:

# find /sys/ | grep rng
/sys/devices/platform/10000000.rng
/sys/devices/platform/10000000.rng/subsystem
/sys/devices/platform/10000000.rng/driver_override
/sys/devices/platform/10000000.rng/modalias
/sys/devices/platform/10000000.rng/uevent
/sys/devices/platform/10000000.rng/of_node
/sys/firmware/devicetree/base/rng@100000d8
/sys/firmware/devicetree/base/rng@100000d8/compatible
/sys/firmware/devicetree/base/rng@100000d8/status
/sys/firmware/devicetree/base/rng@100000d8/reg
/sys/firmware/devicetree/base/rng@100000d8/name
/sys/bus/platform/devices/10000000.rng
/sys/bus/platform/drivers/jz4780-rng
/sys/bus/platform/drivers/jz4780-rng/bind
/sys/bus/platform/drivers/jz4780-rng/unbind
/sys/bus/platform/drivers/jz4780-rng/uevent

Câu trả lời:


4

Một giải pháp hiệu quả để khiến trình điều khiển liên kết với thiết bị là:

cgublock: jz4780-cgublock@10000000 {
    compatible = "simple-bus", "syscon";

    #address-cells = <1>;
    #size-cells = <1>;

    reg = <0x10000000 0x100>;
    ranges;

    cgu: jz4780-cgu@10000000 {
        compatible = "ingenic,jz4780-cgu";
        reg = <0x10000000 0x100>;

        clocks = <&ext>, <&rtc>;
        clock-names = "ext", "rtc";

        #clock-cells = <1>;
    };

    rng: rng@d8 {
        compatible = "ingenic,jz4780-rng";
        reg = <0x100000d8 0x8>;
    };
};

Điều này đã được tìm thấy bằng cách nhìn chằm chằm vào các ví dụ khác. Tôi muốn một giải pháp trong đó tôi có được chẩn đoán thích hợp tại sao lần thử trước không chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.