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ư:
- /programming/28406776/do-binding-USE-device-tree-without-compiverse-opes-in-the-do
- /programming/35580862/device-tree-mismatch-probe-never-called
- /programming/41446737/pl platform -eveice-do-autoloading-mechanism
- Có thể lấy thông tin cho cây thiết bị bằng / sys của kernel đang chạy không?
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 printk
vào chức năng thăm dò của jz4780-rng
trì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-rng
trì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 printk
bấ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ụ, rng
nút toplevel: cgu
không được tham chiếu ở đây, nhưng có một jz4780-cgu
trình điều khiển.
Cập nhật2:
Nếu tôi di chuyển rng
khai báo nút bên ngoài cgu
nú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