Đừ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 1TRƯỜ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 2Giảng viên hướng dẫn: TS Phạm Doãn Tĩnh
Hà Nội, 8-2022
Trang 3LỜ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óm
có 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 4MỤC LỤC
LỜI NÓI ĐẦU i
DANH MỤC HÌNH VẼ 1
DANH MỤC BẢNG BIỂU 2
CHƯƠNG 1 TỔNG QUAN ĐỀ TÀI 3
1.1 Đặt vấn đề 3
1.2 Ý tưởng và mục tiêu 4
1.3 Yêu cầu hệ thống 5
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 53.4 Sơ đE trạng thái 20
CHƯƠNG 4 THỰC HIỆN VÀ KẾT QUẢ 21
4.1 Sản phẩm board mạch 21
4.2 Kết quả thực hiê Fn 22
4.3 Nhận xét và kết luận 24
4.4 Hướng phát triển trong tương lai 24
PHỤ LỤC 25
1 Thư viê Fn sQ dụng cho RASPBERRY PI 4 25
2 Mã nguEn của sản phẩm 25
TÀI LIỆU THAM KHẢO 33
Trang 6DANH 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 7DANH 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 8CHƯƠNG 1 TỔNG QUAN ĐỀ TÀI
1.1 Đặt vấn đề
Đồng hồ thời gian thực (tiếng Anh: real-time clock, viết tắt: RTC) là một thiết bị điện
tử (thường ở dạng mạch tích hợp) theo dõi thời gian đã trôi qua trên thực tế
Mặc dù thuật ngữ này thường đề cập đến các thiết bị trong máy tính cá nhân, máy chủ
và hệ thống nhúng, RTC có mặt trong hầu hết mọi thiết bị điện tử cần giữ thời gianchính xác, khi cả khi các thiết bị điện tử đó không được cấp nguồn
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 9cấ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 101.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 112.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ết
kỹ 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àm
hệ 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 12Hì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 13Hình 4 Các chân kết nối của Pi 4 Cấu hình chân Raspberry Pi
Hình 5 Cấu hình chân Raspberry Pi 4
Mô 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 14Cá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:
USB
PoE Header
Trang 15bị 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 I2C
Mộ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 18Hì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 Clock Thông số kĩ thuật
IC chính: RTC DS1307 + EEPROM AT24C32
Nguồn cung cấp: 5VDC
Giao tiếp: I2C
Trang 19Lư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 20CHƯƠ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 213.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ên
từ đó phân tích chi tiết kết nối giữa các khối với nhau
Trang 22Hì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 23Struct 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 struct
i2c_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`;
Khởi tạo device
Thiết lập thông số device
Đăng kí kernel framework
Hàm remove()
Nguyên mẫu hàm remove() đơn giản như sau:
static int foo_remove(struct i2c_client *client)
Hàm remove() cũng được truyền vào một tham số là struct
i2c_client *client giống như hàm probe() (việc truyền tham số này
do kernel đảm nhận) Nhiệm vụ của hàm remove() là giải phóng những gì hàm probe() cấp phát, bao gồm những dữ liệu riêng cho device
Khởi tạo và đăng kí driver I2C
Trang 24Như ở 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:
Để hệ thống I2C biết về những device cần điều khiển thì ta sử dụng
macro MODULE_DEVICE_TABLE để thông báo
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