1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo bài tập lớn hệ điều hành nhúng đề tài thiết kế device driver rtc 1307 cho raspberry pi

29 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Đừngnhầm lẫn RTC với điện toán thời gian thực, dù cùng được viết tắt bằng ba chữ cáigiống nhau nhưng nó không liên quan trực tiếp đến theo dõi mốc thời gian.Vấn đề thời gian là một vấn đ

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ - VIỄN THÔNG

BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH NHÚNG

Đề tài: Thiết kế Device Driver RTC 1307 cho Raspberry Pi

Nhóm sinh viên thực hiện:

Trang 2

Giảng viên hướng dẫn: TS Phạm Doãn TĩnhHà Nội, 8-2022

Trang 3

LỜI NÓI ĐẦU

Trong hệ thống IoT hiện nay, sự kết nối và phối hợp giữa các thiết bị là rất quantrọng Vậy làm sao để có thể kết nối được với các thiết bị khác, các thiết bị có tươngthích với nhau hay không, tốc độ truyền dữ liệu và độ chính xác như nào là những vấnđề đáng được quan tâm hiện nay Vì vậy, nhóm em đã quyết định chọn đề tài moduleđo thời gian thực để làm đề tài cho bài tập lớn lần này.

Ngoài việc trau dồi các kiến thức về môn học Hệ điều hành nhúng qua lý thuyết và bàitập trên lớp, chúng em cũng mong muốn được áp dụng các kiến thức này vào các vấn đề thiết thực và gần gũi trong thực tế

Trong quá trình thực hiện bài tập lớn của mình, dưới sự hướng dẫn của thầyPhạm Doãn Tĩnh, chúng em đã cố gắng hết sức để hoàn thiện một cách tốt nhất.Nhưng với kiến thức và sự hiểu biết có hạn nên sẽ không tránh khỏi những thiếu sótmong thầy và các bạn đóng góp ý kiến đề tài của nhóm em có thể hoàn thiện hơn.

Em mong sẽ nhận được sự giúp đỡ, góp ý của thầy và các bạn để bài tập nhómcó thể được hoàn thiện hơn, khắc phục được những nhược điểm hiện tại và phát triểnhơn nữa trong tương lai.

Chúng em xin chân thành cảm ơn!

Trang 4

1.3.1 Yêu cầu chức năng 5

1.3.2 Yêu cầu phi chức năng 5

1.4 Lập kế hoạch và phân công nhiệm vụ 5

CHƯƠNG 2 CƠ SỞ LÝ THUYẾT 7

2.1 Device Drivers 7

2.1.1 Lý thuyết và vai trò của driver 7

2.1.2 Mô hình phân lớp theo chiều dọc 7

2.2 Raspberry Pi 4 8

2.3 Lý thuyết giao tiếp I2C 11

2.4 Các thành phần trong chuẩn giao tiếp I2C 11

2.5 RTC 1307 14

CHƯƠNG 3 THIẾT KẾ HỆ THỐNG 15

3.1 Tính toán và lựa chọn thiết bị phần cứng 15

3.1.1 Lựa chọn khối điều khiển và xử lý trung tâm 15

3.1.2 Tính toán và lựa chọn khối nguồn 17

3.2 Tổng kết linh kiện 17

3.3 Sơ đE hê F thống chi tiết 17

3.3.1 Kết nối giữa MCU Raspberry Pi 4 với RTC 18

Trang 5

3.4 Sơ đE trạng thái 20

CHƯƠNG 4 THỰC HIỆN VÀ KẾT QUẢ 21

Trang 6

DANH MỤC HÌNH ẢNH

Hình 1 Module đo thời gian thực RTC 1307 2

Hình 2 Raspberry Pi 3

Hình 3 Mô hình phân lớp theo chiều dọc 7

Hình 4 Các chân kết nối của Pi 4 8

Hình 5 Cấu hình chân Raspberry Pi 4 8

Hình 6 Các hỗ trợ thiết bị ngoại vi 9

Hình 7 Chuẩn giao tiếp I2C 10

Hình 8 Cách kết nối giao thức I2C 11

Hình 9 Cách thức truyền dữ liệu trong giao thức I2C 11

Hình 10 Điều kiện bắt đầu 12

Hình 11 Điều kiện kết thúc 13

Hình 12 Module Real Time Clock 13

Hình 13 Raspberry Pi 4 Model B 15

Hình 14 Nguồn cho vi điều khiển 15

Hình 15 Sơ đồ hệ thống chi tiết 16

Hình 16 Sơ đồ trạng thái của hê t thống 22

Hình 17 Ảnh mạch thật của nhóm 23

Hình 18 Chạy lần đầu cần khởi tạo thời gian 23

Hình 19 Hình ảnh hiển thị quá trình chạy 24

Trang 7

DANH MỤC BẢNG BIỂU

Bảng 1 Phân công nhiệm vụ 5Bảng 2 Bảng linh kiện 16Bảng 3 Sơ đồ kết nối chân giữa SSD1306 với MCU 17

Trang 8

CHƯƠNG 1 TỔNG QUAN ĐỀ TÀI

Thuật ngữ đồng hồ thời gian thực được sử dụng để tránh nhầm lẫn với đồng hồ điện tửkhác sử dụng xung nhịp đồng hồ (clock signal) là tín hiệu cho các thiết bị điện tử kỹthuật số, và không tự tính được thời gian bằng các đơn vị con người sử dụng Đừngnhầm lẫn RTC với điện toán thời gian thực, dù cùng được viết tắt bằng ba chữ cáigiống nhau nhưng nó không liên quan trực tiếp đến theo dõi mốc thời gian.

Vấn đề thời gian là một vấn đề rất quan trọng trong cuộc sống hiện nay, nên chúng emquyết định chọn module đo thời gian thực để làm đề tài ở Hình 1 như sau:

Hình 1 Module đo thời gian thực RTC 1307

Device driver hay trình điều khiển thiết bị là một chương trình máy tính vận hành hoặcđiều khiển một loại thiết bị ngoại vi cụ thể được gắn vào một con chip Driver cung

Trang 9

cấp giao diện phần mềm cho các thiết bị phần cứng, cho phép hệ điều hành (nếu có) vàcác chương trình khác truy cập các chức năng phần cứng mà không cần biết chi tiếtchính xác về phần cứng đang được sử dụng.

Có thể nói nếu thiếu device driver thì giữa các thiết bị với nhau không giao tiếp được,giữa người dùng và phần cứng thiết bị không thể tương tác được.

Raspberry Pi là cái máy tính giá 35USD kích cỡ như iPhone và chạy HĐH Linux Vớimục tiêu chính của chương trình là giảng dạy máy tính cho trẻ em Được phát triển bởiRaspberry Pi Foundation – là tổ chức phi lợi nhuận với tiêu chí xây dựng hệ thống mànhiều người có thể sử dụng được trong những công việc tùy biến khác nhau.

Hình 2 Raspberry Pi

Hiện nay, Raspberry Pi được tích hợp rất nhiều chức năng như chạy bằng Linux vớicác tiện ích như lướt web , môi trường Desktop và các nhiệm vụ khác Sinh viên hoàntoàn có thể lập trình thay đổi, cài đặt môi trường mô phỏng lại hệ thống máy tínhthông thường Tuy nhiên, vẫn có nhiều thiết bị mà Raspberry Pi chưa thể giao tiếpđược

1.2 Ý tưởng và mục tiêu

Xuất phát từ vấn đề thực tế, mục tiêu của nhóm tập trung vào việc viết và cài đặtDriver cho Raspberry Pi sử dụng module thời gian thực, hiển thị lên… Giúp ngườidùng sử dụng trong các hệ thống Iot với các thông tin được hiển thị một cách trựcquan giúp người dùng dễ dàng nắm bắt.

1.3 Yêu cầu hệ thống

Hệ thống cần chạy ổn định, độ chính xác cao và độ trễ thấp.

Trang 10

1.3.1 Yêu cầu chức năng

Raspberry Pi kết nối được và lấy dữ liệu đến RTC 1307 thành công, hiển thị thôngtin không bị sai lệch.

1.3.2 Yêu cầu phi chức năng

Bên cạnh các yêu cầu chức năng ở trên, sản phẩm cuối cùng cần phải đảm bảo một sốyêu cầu như:

Mạch hoạt động ổn định, chính xác, tiêu thụ điện năng thấp.Sản phẩm nhỏ gọn, kích thước mạch không quá lớn, dễ dàng lắp đặt.Độ trễ lấy thời gian là 1s

1.4 Lập kế hoạch và phân công nhiệm vụ

Nhóm thực hiê tn phân chia công viê tc và phân công nhiê tm vụ, phân tích chi tiết kếhoạch thực hiê tn.

Phân tích yêu cầu hệ thống Thảo Anh + Phương

Tìm hiểu Device Driver Thuận + Phương + Tuấn

Lắp mạch và Test Phương + Đức Anh + Thảo Anh

Bảng 1 Phân công nhiệm vụCHƯƠNG 2 CƠ SỞ LÝ THUYẾT

Trang 11

2.1 Device Drivers

2.1.1 Lý thuyết và vai trò của driver

Driver là một trình điều khiển có vai trò điều khiển, quản lý, giám sát một thực thể nàođó dưới quyền của nó Bus driver làm việc với một đường bus, device driver làm việcvới một thiết bị (chuột, bàn phím, màn hình, đĩa cứng, camera, …).

Các device driver để vận hành các thiết bị, mang đặc trưng của từng thiết bị xác định.Ngoài ra, mục đích quan trọng của các driver thiết bị là cung cấp một giao diện trừutường hóa cho người sử dụng, tức là cung cấp một giao diện lên tầng trên của hệ điềuhành Một cách tổng quan, một driver sẽ bao gồm 2 phần quan trọng:

Giao tiếp với thiết bị (Device-specific) Giao tiếp với hệ điều hành (OS-specific)

Thành phần giao tiếp với thiết bị (device-specific) của một driver là giống nhau đốivới tất cả các hệ điều hành Nó có thể hiểu và giải mã các thông tin về thiết bị (chi tiếtkỹ thuật, kiểu thao tác, hiệu năng, cách lập trình giao tiếp với thiết bị, …).

Thành phần giao tiếp với hệ điều hành (OS-specific) gắn kết chặt chẽ với các cơ chếcủa hệ điều hành, và do vậy sẽ là khác nhau giữa một driver trên Linux và một drivertrên Windows, hoặc MacOS, …

2.1.2 Mô hình phân lớp theo chiều dọc

Trên Linux, device driver cung cấp một giao diện “system call” (giao diện gọi các hàmhệ thống) đến tầng ứng dụng cho người dùng; đây được coi là một ranh giới giữa tầngnhân (kernel space) và tầng người dùng (user space) của Linux Mô hình phân tầngđược chỉ ra như hình dưới đây:

Trang 12

Hình 3 Mô hình phân lớp theo chiều dọc

2.2 Raspberry Pi 4

Raspberry là gì ?

Raspberry pi 4 là một máy tính cỡ nhỏ sử dụng hệ điều hành Linux Đây là loạimáy tính cỡ nhỏ được sử dụng chủ yếu để chạy các chương trình lớn nhằm đạt tínhiệu đầu ra nhanh chóng.

Có tất cả các hệ thống truyền thông có dây và không dây mới nhất được yêu cầu sửdụng trong hầu hết các dự án điều khiển thông minh.

Raspberry Pi 4 là vi xử lý 4 lõi và có ba phiên bản khác nhau có ba dung lượngRAM khác nhau Pi 4 sử dụng mini HDMI và hỗ trợ hai cổng cho hai màn hình4K.

Trang 13

Hình 4 Các chân kết nối của Pi 4Cấu hình chân Raspberry Pi

Hình 5 Cấu hình chân Raspberry Pi 4Mô tả chân Raspberry Pi :

Raspberry Pi 4 có thể sử dụng trong hệ thống nhúng bên ngoài để giao tiếp tínhiệu

Có tổng cộng 40 chân , trong đó 28 chân là chân GPIO và các chân còn lại là chânnguồn (Power in, Power out, Ground).

Các chân GPIO không chỉ thực hiện các chức năng I / O đơn giản mà còn hỗ trợgiao thức UART, SPI và I2C

Trang 14

Các giao thức này dành riêng cho mọi chân.

Module giao tiếp dữ liệu nối tiếp Raspberry Pi

Raspberry có thể truyền dữ liệu bằng các cách sau:UART

Giao thức SPI.Chân giao tiếp I2C.Các chân GPIO PWM Các chân SDIO.

Ở đây chúng ta sẽ chọn giao thức I2C để thực hiện bài tập lớn.

Mô tả bảng mạch Raspberry pi 4

Có hỗ trợ nhiều ngoại vi có thể được sử dụng:

Hình 6 Các hỗ trợ thiết bị ngoại viCác thiết bị ngoại vi chính khác

USB PoE Header

Trang 15

Máy ảnhMàn hìnhÂm thanhThẻ SD

2.3 Lý thuyết giao tiếp I2C

Giao thức I2C

I2C là một giao thức giao tiếp để truyền dữ liệu giữa một bộ xử lý trung tâm với nhiều IC trên cùng một board mạch chỉ sử dụng hai đường truyền tín hiệu.Được sử dụng rộng rãi cho giao tiếp giữa vi điều khiển và mảng cảm biến, các thiếtbị hiển thị, thiết bị IoT, EEPROMs, v.v …

Đây là một loại giao thức giao tiếp nối tiếp đồng bộ

Hình 7 Chuẩn giao tiếp I2C

2.4 Các thành phần trong chuẩn giao tiếp I2C

Tổng quan về I2C:

Bus I2C chỉ gồm hai dây SCL và SDA

Dữ liệu được truyền đi được gửi qua dây SDA và được đồng bộ với tín hiệu đồng hồ (clock) từ SCL

Tất cả các thiết bị / IC trên mạng I2C được kết nối với cùng đường SCL và SDA

Các thiết bị kết nối với bus I2C được phân loại hoặc là Master hoặc là Slave

Trang 16

Ở bất cứ thời điểm nào thì chỉ có duy nhất một thiết bị Master ở trang thái hoạt động trên bus I2C Nó điều khiển đường tín hiệu đồng hồ SCL và quyết định hoạt động nào sẽ được thực hiện trên đường dữ liệu SDA.

Hình 8 Cách kết nối giao thức I2C

Giao thức truyền dữ liệu

Giao thức sau đây (tập hợp các quy tắc) được theo sau bởi thiết bị Master và các thiết bị Slave để truyền dữ liệu giữa chúng.

Dữ liệu được truyền giữa thiết bị Master và các thiết bị Slave thông qua một đường dữ liệu SDA duy nhất, thông qua các chuỗi có cấu trúc gồm các số 0 và 1 (bit)

Mỗi chuỗi số 0 và 1 được gọi là giao dịch (transaction) và dữ liệu trong mỗi giao dịch có cấu trúc như sau:

Hình 9 Cách thức truyền dữ liệu trong giao thức I2CMột số chi tiết về I2C

Trang 17

Điều kiện bắt đầu (Start Condition) SDA từ mức điện áp cao xuống mức điện áp thấp trước khi đường SCL chuyển từ cao xuống thấp.

Khi điều kiện bắt đầu được gửi bởi thiết bị Master, tất cả các thiết bị Slave đều hoạtđộng ngay cả khi chúng ở chế độ ngủ (sleep mode) và đợi bit địa chỉ.

Hình 10 Điều kiện bắt đầu

Khối địa chỉ (Nó bao gồm 7 bit )

Bit Read / Write (Bit này xác định hướng truyền dữ liệu)Bit ACK / NACK (Bit kiểm tra)

Khối dữ liệu (Bao gồm 8 bit và chúng được thiết lập bởi bên gửi

Điều kiện kết thúc (Stop condition) Đường SDA từ mức điện áp thấp sang mức điện áp cao trước khi đường SCL chuyển từ cao xuống thấp.

Trang 18

Hình 11 Điều kiện kết thúc

2.5 RTC 1307

Mạch thời gian thực RTC DS1307 được sử dụng để cung cấp thông tin thời gian: ngày,tháng, năm, giờ, phút, giây, cho vi điều khiển qua giao tiếp I2C, mạch tích hợp sẵnpin backup để duy trì thời gian trong trường hợp không cấp nguồn, ngoài ra mạch cònđược tích hợp thêm IC EEPROM AT24C32 để lưu trữ thông tin khi cần, thích hợp chocác ứng dụng điều khiển hoặc đồng bộ dữ liệu thời gian thực RTC.

Hình 12 Module Real Time ClockThông số kĩ thuật

IC chính: RTC DS1307 + EEPROM AT24C32Nguồn cung cấp: 5VDC.

Giao tiếp: I2C

Trang 19

Lưu trữ và cung cấp các thông tin thời gian thực: ngày, tháng, năm, giờ, phút, giây,

Có pin backup duy trì thời gian trong trường hợp không cấp nguồn.Có ngõ ra tần số 1Hz.

Kích thước: 27 x 28 x 8.4mm.

Một số tính năng quan trọng của DS1307 là:

Khả năng tạo sóng vuông có thể lập trình.

Dòng điện thấp, dưới 500mA trong chế độ sao lưu pin.Khả năng thiết lập ngày đến năm 2100.

Sử dụng chuẩn giao tiếp I2C.

Một số chi tiết của DS1307:

Module DS1307 sử dụng pin CR2023 3 volt Bộ nhớ EEPROM 24c32 nhúng trên mô-đun này có thể tiết kiệm 32kb dữ liệu

Ngoài ra, có thể đo nhiệt độ môi trường bằng cách sử dụng cảm biến DS18B20 đã được tích hợp sẵn trên board mạch

Đọc giá trị điện áp của pin từ chân BAT.

Trang 20

CHƯƠNG 3 THIẾT KẾ HỆ THỐNG

3.1 Tính toán và lựa chọn thiết bị phần cứng

3.1.1 Lựa chọn khối điều khiển và xQ lý trung tâm

Theo yêu cầu chức năng của sản phẩm, ta có thể xác định các yêu cầu cho khối xửlý trung tâm như sau:

Tối thiểu 5 GPIO ( 5 GPIO OUTPUT )Tiết kiệm năng lượng

Trang 21

3.1.2 Lựa chọn khối nguEn

Do các linh kiện có điện áp sử dụng từ 3.3–5V, yêu cầu sản phẩm đặt trong các không

gian kín nên adapter 5V-2A như Error: Reference source not found là một lựa chọn

phù hợp vừa đảm bảo về mặt công suất cũng như nơi sử dụng

Hình 14 Nguồn cho vi điều khiển

3.2 Tổng kết linh kiện

Các linh kiện được nhóm em thiết kế và sử dụng được thể hiện ở bảng dưới đây:

3.3 Sơ đồ hê € thống chi tiết

Dựa trên các linh kiện hiện có, nhóm đưa ra sơ đồ hê t thống kết nối giữa các khối trêntừ đó phân tích chi tiết kết nối giữa các khối với nhau.

Trang 22

Hình 15 Sơ đồ hệ thống chi tiết

3.3.1 Kết nối giữa MCU Raspberry Pi 4 với RTC

Như đã trình bày ở trên, trong đề tài này nhóm quyết định sử dụng RTC 1307 để hiểnthị dữ liệu từ Pi 4.

Bảng 3 Sơ đồ kết nối chân giữa RTC 1307 với MCU

3.3.1.2 Xây dựng Driver

Struct i2c_driver

I2C protocol driver được dại diện trong kernel bằng struct i2c_driver I2C clientdevice được đại diện bằng struct i2c_client.

Trang 23

Struct i2c_driver được định nghĩa như sau:struct i2c_driver {

/* module giao diện driver tiêu chuẩn */

(*probe)(int struct i2c_client *, const structi2c_device_id *);

(*remove)(int struct i2c_client *);

/* driver model interfaces không liên quan đ Ān liệt kê*/

void (*shutdown)(struct i2c_client *); struct device_driver driver;

const struct i2c_device_id *id_tablex`;};

Hàm probe là một phần của struct i2c_driver, và nó được thực hiện khi xảy ra matchgiữa một i2c device và i2c driver Các nhiệm vụ cần thiết của hàm probe() là:

Kiểm tra xem device được match có đúng là device mong muốn hay không.Kiểm tra chức năng I2C bus controller

Khởi tạo device.Thiết lập thông số device.Đăng kí kernel framework.

Khởi tạo và đăng kí driver I2C

Trang 24

Như ở bài Platform Driver, kernel cung cấp cho chúng ta mộ họ hàm là module_*_driver, dành cho việc, đăng kí/hủy đăng kí driver với hệ thống trong các hàm init/exit Với I2C thì hàm được sử dụng là:module_i2c_driver(ds1307_driver);

Driver và device provisioning

Như cơ chế match giữa driver và driver, ta cần cấp mảng device_id để thông báo những device mà driver có thể điều khiển Với các I2C device thì mảng struct là i2c_device_id Struct này được định nghĩa như sau:

struct i2c_device_id {

char name[I2C_NAME_SIZE]; kernel_ulong_t driver_data;};

MODULE_DEVICE_TABLE(i2c, my_idtable);

Giao tiếp với client.

Bản chất giao tiếp I2C chỉ là việc thao tác với các thanh ghi (ghi/đọc thông tin).Hệ thống I2C trong linux cung cấp cho ta 2 loại API, loại thứ nhất là loại truyền thống, dành riêng cho I2C, loại thứ 2 sử dụng giao tiếp SMBUS device, loại này tương thích với giao tiếp I2C thông thường.

Giao tiếp I2C truyền thống

Trang 25

Ta sử dụng 2 hàm dưới đây để giao tiếp với các I2C device:int i2c_master_send(struct i2c_client *client, const char*buf, count);int

int i2c_master_recv(struct i2c_client *client, char *buf, int count);

Hầu hết các hàm giao tiếp I2C đều phải lấy struct i2c_client là tham số để biết được chính xác phải giao tiếp với I2C device nào Tham số thứ 2 chứa những byte cần đọc hoặc ghi vào, tham số thứ 3 là số byte để đọc hoặc ghi Giống như hầu hết các hàm đọc/ghi khác, giá trị trả về của hàm là số byte được đọc/ghi thành công.

Khởi tạo I2C device trong file cấu hình board (file code C - cách cũ)

Có một điều chắc chắn là ta luôn phải thông báo cho kernel về sự xuất hiện của các thiết bị vật lý trong hệ thống Như đã biết thì có hai kiểu khai báo device trong kernel: dùng file cấu hình board code c, device tree Với kiểu khai báo trong code C thì ta sử dụng struct i2c_board_info để đại diện cho một I2C device.

Struct này được định nghĩa:struct i2c_board_info { char type[I2C_NAME_SIZE]; unsigned short addr;

void *platform_data; irq;int

Tuy nhiên khai báo này là cũ và không được khuyên dùng nữa.

I2C và device tree (không dùng trong project này)

Để cấu hình và điều khiển được các I2C device, ta phải làm 2 bước:Định nghĩa và đăng kí I2C driver

ĐỊnh nghĩa và đăng kí I2C device

Ngày đăng: 29/05/2024, 17:53

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN