Kernel & Device Driver trên Linux

Chào anh Đạt và mọi người. Em mong anh Đạt và những anh chị có kinh nghiệm giải đáp giúp em vấn đề này.
Em đang làm luận văn tốt nghiệp năm 4 ở trường DH Khoa Học Tự Nhiên. Đề tài mà em đang theo đuổi là muốn viết được 1 Driver cho board SoCkit của Altera. Driver gì thì em cũng chưa xác định được vì đang ở mức độ bắt đầu.
Trình độ hiện tại.

  • Hiện em đã dùng Linux được khoảng 1 năm
  • Em đã đọc xong cuốn Linux Command Line. Có thể viết được 1 application Shell Script đơn giản và command lines cũng đã nắm.
    https://www.amazon.com/Linux-Command-Line-Complete-Introduction/dp/1593273894
    Dự kiến nghiên cứu:
  • Em sẽ tham khảo Linux Kernel Development (3rd Edition) để biết về Kernel sau đó là cuốn Linux Device Drivers, 3rd Edition để viết 1 Driver căn bản rồi tiến tới viết 1 Driver cho riêng con board SoCkit của Altera.
    Em biết vấn đề này rất khó làm và số lượng người hướng dẫn về lĩnh vực này cũng rất hạn chế, hiện tại là tháng 10 và em sẽ báo cáo vào tháng 7 năm sau. Nghĩa là em còn chưa tới 9 tháng để nghiên cứu và làm.
    Anh Đạt và mọi người cho em xin ý kiến.
    1/ Với trình độ hiện tại của em thì 9 tháng có đủ không?
    Nếu đủ thì tên đề tài em nên đặt là gì? Bởi vì bây giờ em cũng chưa xác định được mình sẽ viết driver gì. Nên không thể ghi tên đề tài là ví dụ: “Viết driver cho audio hay USB” được vì nó quá chi tiết. Nếu lỡ sau khi nghiên cứu xong mình không muốn chọn cái này nữa thì cũng không đổi được.
    2/ Nếu thời gian là đủ vậy thì lộ trình em phải làm là đọc hết 2 cuốn sách em để trên rồi mới tiến tới mới viết Driver cho nghiên cứu của mình có hợp lý không? Nếu không thì anh chị cho em lời khuyên để sửa lại nhé!
    Em cảm ơn rất nhiều. Mong mọi người giúp đỡ. Thời gian cũng không còn nhiều nữa
4 Likes

Mình cũng có ý định tìm hiểu thêm về linux kernel, chờ người có kinh nghiệm chia sẻ vậy. :slight_smile:

Đầu tiên là bạn phải xác định là bạn sẽ viết cái gì cho con SoCkit đó, nó là cái gì, hardware thế nào, đã ai viết driver cho nó chưa. Các SoC tương tự họ viết thế nào ?
Driver trên linux gồm 2 phần.

  • Giao tiếp với Hardware
  • Giao tiếp với kernel
    Với Hardware bạn cần làm những điều như mình nói như trên, tìm hiểu về hardware, datasheet của nó. Bạn có thể dùng 1 con vđk để làm những việc này vì vdk debug khá dễ dàng không như trên linux kernel. Xây dựng những hàm cơ bản và thao tác trên vđk (nếu được vì nếu SoC của bạn dùng các loại bus như PCI, SATA… thì sẽ ko làm đc).
    Sau khi đã implement các hàm cần thiết để thao tác với hardware bạn sẽ cần làm sao để liên kết nó với các layer trên của kernel hoặc xuất ra cho người dùng dùng. Cái này không quá khó và bạn chẳng cần đọc hết 2 quyển sách kia để làm. 2 quyển đó tham khảo là chính chứ không phải để đọc một lèo hết, rất dễ tẩu hỏa nhập ma. Trong bước này bạn sẽ phải học cách viết module, cấp phát bộ nhớ dưới kernel, debug, các api đk hardware viết ở bước một sẽ dùng để liên kết với tầng user hoặc các subsystem khác của kernel. Thường là qua con trỏ hàm.
    OK hy vọng bạn đã biết mình nên làm gì.
1 Like

Dạ em cảm ơn anh,
Em có một thắc mắc nhỏ nữa. Con board SoCkit, em đã tham khảo cộng đồng, theo em thấy cộng đồng nghiên cứu về kernel và viết driver cho con này không nhiều. Con board này chạy lõi ARM Cortex A9 Dual. Trang chủ Terasic của con board này có cấp cho nó 1 cái .img hệ điều hành Ubuntu 14.04 và tất cả device trên con board này ví dụ Audio, LCD, UART, Ethernet đều đã được hãng viết sãn driver.
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=816
Vậy theo anh thì em có nên nghiên cứu trên con board này không? Hay chuyển sang các con board có cộng đồng lớn hơn như Raspberry PI, hay Beagle Bone Board?
Nếu em nghiên cứu về driver trên con board này, vậy thì em sẽ tìm vào source code driver của hãng sau đó chỉnh sửa theo ý mình. Hướng như vậy có được không anh nhỉ?
Em cảm ơn anh

Thường thì chip vendor sẽ support code cho cpu của họ sẵn rồi, các driver như uart, spi, watch dog viết hết r. Mình không nên viết lại làm gì. Mà viết lại debug cũng thực sự là khó, mang ý nghĩa học là chính. Cái mình cần là cách sử dụng nó dưới kernel
Driver các ct viết là cho các ngoại vi, ví dụ như họ mua con chip wifi mới, họ cần tích hợp nó vào board. Nếu chip đó chưa có driver thì viết mới, nếu có rồi thì sửa lại cho fit với yêu cầu của mình. Hoặc ví dụ bo mạch có giao tiếp với một vài loại led, cảm biến … Mình sẽ viết driver để dùng các tài nguyên của CPU như uart, spi … giao tiếp và đk các ngoại vi trên board dưới kernel.
Bạn nên đọc và tìm hiểu cách dùng sau đó mới sửa. Board của bạn mình xem khá nhiều ngoại vi, thử viết một cái driver dùng ngắt ngoài bật công tắc thì sáng led xem :smiley:
Nếu bạn có sẵn board và có sẵn source code của bản kernel đang dùng thì cứ thế dùng thôi, đã là linux rồi thì như nhau.

1 Like

Dạ em cảm ơn anh :smiley: Anh trả lời rõ ràng và nhiệt tình quá :stuck_out_tongue:
Em sẽ tìm hiểu theo hướng mà anh nói. Không biết anh có thể cho em xin e-mail được không? Nếu trong quá trình nghiên cứu có gì trục trặc em mail hỏi anh nhé! Hứa sẽ không làm phiền anh nhiều đâu, chỉ khi nào bí lắm em mới hỏi thôi :smiley:

okey email me : [email protected]

Không biết anh còn lưu lại khoá luận không ạ. Em cũng đang theo đuổi device driver mong được anh truyền tí kinh nghiệm :smile: :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?