Devicetree là một kỹ thuật mô tả phần cứng được sử dụng rộng rãi trong embedded Linux. Đa số các kỹ sư lập trình embedded Linux đều biết cách dùng, nhưng liệu chúng ta đã thực sự hiểu hết về những khái niệm cơ bản nhất của nó? Bài viết này sẽ điểm qua vài khái niệm về devicetree.
Devicetree là gì?
Có thể thấy, việc mô tả phần cứng ngày càng phức tạp. Ngoài ra các phần cứng lại có tính kế thừa. (Ví dụ: dòng chip I.MX8 có sự kế thừa từ I.MX6, chưa kể nếu thiết kế mạch mới và gắn SoC lên thì việc viết lại phần mô tả hardware của tất cả các module trong SoC sẽ mất rất nhiều thời gian). Vì vậy người ta nghĩ đến 1 bộ tiêu chuẩn nào đó chuyên dùng để mô tả thông tin phần cứng. Nó phải dễ sử dụng, dễ chỉnh sửa và có khả năng tái sử dụng khi chuyển đổi sang các phần cứng giống nhau. Đây chính là lý do mà devicetree được ra đời. Ngày nay một số nhà cung cấp SoC còn cho chúng ta cả tool cho phép tự tạo ra ra file devicetree dựa vào bản vẽ Schematic.
Chỉ embedded Linux mới dùng devicetree?
Hoàn toàn sai. Devicetree là 1 bộ tiêu chuẩn để mô tả phần cứng một cách hiệu quả. Do đó thì ngay cả lập trình MCU cũng dùng devicetree. Ví dụ như STM32. Ngoài ra những OS khác không phải Linux cũng sử dụng devicetree. Tuy nhiên, devicetree chỉ sử dụng cho kiến trúc ARM. Đối với kiến trúc intel thì cpu có khả năng tự lấy được thông tin phần cứng thông qua các bản tin probe được truyền vào bus, do đó nó không cần dùng devicetree để mô tả phần cứng.
Devicetree Binding là gì?
![](https://vinalinux.com.vn/wp-content/uploads/2024/01/image-15.png)
(1 ví dụ về devicetree binding cho module watchdog trong linux)
Bộ tiêu chuẩn devicetree chúng ta có thể tải trên mạng ở trang devicetree.org. Tuy nhiên trong bộ tiêu chuẩn này nó chỉ đưa ra quy định về việc mô tả 1 thông tin riêng lẻ sẽ như thế nào. Ví dụ như thông tin về địa chỉ bộ nhớ, thông tin về địa chỉ ngắt… Đối với việc mô tả 1 module phần cứng sẽ bao gồm nhiều thông tin kết hợp với nhau. Bao gồm thông tin về địa chỉ thanh ghi, địa chỉ ngắt, địa chỉ DMA… Thậm chí có 1 số loại thông tin chỉ trên Linux mới sử dụng. Do vậy để đưa ra qui định cụ thể về việc đối với 1 module như SPI, I2C cần phải mô tả những gì thì Linux sẽ có bộ tiêu chuẩn riêng. Đó gọi là devicetree binding. Tài liệu về devicetree binding mọi người có thể xem ở folder Documentations/devicetree/binding ở trong folder code của kernel. Trong đó sẽ mô tả và có ví dụ cụ thể về việc mô tả từng module sẽ như thế nào.