Lưu ý: Tôi đang liệt kê vấn đề này như hiện nay, tôi là không phản đối việc thay đổi việc triển khai (di chuyển lớp học thành một khu vực chung). Tôi chỉ không chắc chắn làm thế nào để làm điều đó. : Lưu ý cuốiTrong Linux, bạn sử dụng device_create trong lớp hiện tại như thế nào?
Tôi có hai mô-đun hạt nhân Linux và tôi đang cố cập nhật các mục nhập/sys cho chúng. Tìm kiếm xung quanh trên google và các nguồn khác, tôi đã nhìn thấy rất nhiều mã dọc theo dòng:
static dev_t MyDev;
static struct class *c1;
static int __init start_func(void)
{
...
MyDev = MKDEV(nMajor, MINOR_VERSION);
register_chrdev_region(MyDev, 1, MODULE_NAME);
c1 = class_create(THIS_MODULE, "chardrv");
device_create(c1, NULL, MyDev, NULL, MODULE_NAME);
....
Và tôi đã xác minh cho mô-đun đầu tiên của tôi mã này hoạt động, và nó một cách chính xác tạo ra một:
/sys/class/chardrv/<MODULE_NAME>
mục nhập. Những gì tôi muốn biết là làm thế nào để bạn tạo một thiết bị trong một lớp học hiện có. Nói cách khác, một trong các mô-đun của tôi đã tạo lớp chardrv mới này, bây giờ tôi muốn mô-đun khác của tôi có thể đăng ký các thiết bị của nó trong cùng một lớp.
tôi không thể gọi class_create() một lần nữa (trong module thứ hai), bởi vì đó lớp "chardrv" đã tồn tại ...
Vì vậy, tôi có thể chạy một kiểm tra để xem nếu/sys/lớp/chardrv tồn tại và điều này có thể giúp tôi quyết định xem tôi có cần gọi class_create() hay không, đó không phải là vấn đề. Cho phép đặt một số mã giả tại đây để làm rõ:
if (path "/sys/class/chardrv" does not exist)
new_class = class_create("chardrv")
else
new_class = some how get class "chardrv" handle, or properties, or whatever
device_create(new_class, ...)
Vì vậy, theo ví dụ này, nếu lớp học của tôi đã tồn tại, và tôi chỉ muốn thêm thiết bị mới của tôi vào nó từ một mô-đun thứ hai Tôi giả sử tôi cần để tạo cấu trúc lớp học và bằng cách nào đó, hãy điền nó với thuộc tính "lớp chardrv" chính xác, sau đó gọi device_create như trước, nhưng tôi không chắc chắn cách thực hiện điều đó.
Tôi không chắc chắn bạn đang rõ ràng khi tôi đang cố gắng làm ở đây ... ít nhất là lỗi đó không có ý nghĩa đối với câu hỏi của tôi. Ví dụ, tôi muốn tạo một lớp "chardrv", sau đó có một mô-đun hạt nhân đăng ký một thiết bị vào đó. Nói "device1". Sau đó, một mô-đun hạt nhân thứ hai sẽ đăng ký một thiết bị thứ hai vào cùng một lớp "device2". Vì vậy, bây giờ chạy một lệnh danh sách trên/sys/class/chardrv sẽ hiển thị cả hai thiết bị. Bạn có nói rằng không có cách nào để làm điều đó trong Linux? Dường như không đúng với tôi ... – Mike