Chương 2
Lập trình vào ra cơ bản
Lập trình nhúng ARM-Linux
57
Mục tiêu chương 2
Sau khi kết thúc chương n{y, sinh viên có thể
• Nắm được nguyên tắc lập trình giao tiếp v{o ra cơ
bản trên hệ điều h{nh Linux nhúng
• Lập trình giao tiếp thiết bị (ghép nối GPIO) với
driver đ~ có (led, button)
• Biết c|ch lập trình giao tiếp GPIO mở rộng dựa trên
giao diện sysfs (gpiolib)
Lập trình nhúng ARM-Linux
58
Nội dung bài học
2.1. Cơ chế lập trình giao tiếp thiết bị 2.2. Lập trình điều khiển led đơn 2.3. Lập trình giao tiếp nút bấm 2.4. Lập trình giao tiếp GPIO mở rộng
Lập trình nhúng ARM-Linux
59
2.1. Cơ chế lập trình giao tiếp thiết bị
Device files, Device number Kiểm tra danh s|ch device driver, thiết bị Cơ chế giao tiếp
Lập trình nhúng ARM-Linux
60
Mô hình giao tiếp ứng dụng – thiết bị
User Space
Phần mềm ứng dụng
Device files
Các hàm giao tiếp chuẩn: •open •close •read •write •ioctl •…
Device Drivers
Kernel Space (Toàn quyền truy xuất trực tiếp tài nguyên phần cứng của hệ thống)
Phần cứng
Lập trình nhúng ARM-Linux
61
Device files, Device number
Device files: ls –l /dev
• Device file không phải l{ file thông thường, không
phải l{ một vùng dữ liệu trên hệ thống file
• Qu| trình đọc ghi device file Giao tiếp với device driver Đọc, ghi phần cứng của thiết bị
Ph}n loại device files
• Character device: thiết bị phần cứng đọc, ghi một
chuỗi c|c byte dữ liệu
• Block device: thiết bị phần cứng đọc, ghi một khối
Lập trình nhúng ARM-Linux
dữ liệu
62
Device files, Device number
Device number: mỗi thiết bị được x|c định bởi hai
gi| trị • Major device number: x|c định thiết bị n{y sử dụng
drvier nào
• Minor device number: ph}n biệt giữa c|c thiết bị kh|c nhau cùng sử dụng chung một device driver
Lập trình nhúng ARM-Linux
63
Kiểm tra danh sách thiết bị
Kiểm tra danh s|ch c|c thiết bị
• Gõ lệnh ls –al /dev
Giải thích thông tin
Loại thiết bị: char device hay block device Tài khoản người dùng Tên thiết bị Major và minor number Mount ponint
Lập trình nhúng ARM-Linux
64
Kiểm tra danh sách thiết bị
Kiểm tra danh s|ch c|c nhóm thiết bị
• Gõ lệnh cat /proc/devices
Lập trình nhúng ARM-Linux
65
Cơ chế lập trình giao tiếp thiết bị
Cơ chế lập trình
• Sử dụng c|c h{m v{o ra file
open close read write
• Sử dụng h{m điều khiển v{o ra: ioctl
Lập trình nhúng ARM-Linux
66
2.2. Lập trình điều khiển led đơn
Sử dụng led driver đ~ có 4 led đơn, ghép nối qua GPB5,6,7,8 Điều khiển led on/off, tạo hiệu ứng: nhấp nh|y,
chạy đuổi, …
Cần sử dụng h{m trễ (delay): sleep, usleep (thư
viện sys/time.h)
Lập trình nhúng ARM-Linux
67
Mô hình giao tiếp điều khiển led
Phần mềm ứng dụng
leds.c
Hàm giao tiếp: •open •close •ioctl
Device files
/dev/leds
Device Drivers
Mini2440_leds.c
Phần cứng
GPIO Port
Lập trình nhúng ARM-Linux
68
Lập trình điều khiển led đơn
fd=open(“/dev/leds”,0)
• fd: file id • /dev/leds: device file • 0: WRITE_ONLY ioctl(fd, on, led_no) • Ioctl: IO control • Điều khiển bật/tắt led đơn có số hiệu led_no
Driver cho led đơn:
linux-2.6.32.2/drivers/char/mini2440_leds.c
Lập trình nhúng ARM-Linux
69
Mã nguồn minh họa điều khiển led đơn
Lập trình nhúng ARM-Linux
70
2.3. Lập trình giao tiếp nút bấm
Giao tiếp qua driver đ~ có
Lập trình nhúng ARM-Linux
71
Mô hình giao tiếp điều khiển nút bấm
Phần mềm ứng dụng
Buttons.c
Hàm giao tiếp: •open •close •read
Device files
/dev/buttons
Device Drivers
Mini2440_buttons.c
Phần cứng
GPIO Port
Lập trình nhúng ARM-Linux
72
Lập trình ghép nối nút bấm
buttons_fd=open(“/dev/buttons”,0)
• buttons_fd: file id • /dev/buttons: device file
read(buttons_fd,current_buttons,sizeof(curren
t_buttons) • Đọc trạng th|i c|c nút bấm close(buttons_fd): đóng file M~ nguồn driver cho nút bấm
linux- 2.6.32.2/drivers/char/mini2440_buttons.c
Lập trình nhúng ARM-Linux
73
Mã nguồn chương trình đọc nút bấm
Lập trình nhúng ARM-Linux
74
2.4. Lập trình giao tiếp GPIO mở rộng
2 c|ch sử dụng giao tiếp gpio (từ Linux user space) • Cách 1: Viết gpio driver (trên không gian nh}n hệ điều h{nh, kernel space), giao tiếp qua driver n{y.
(Ví dụ với led, button đ~ l{m) • Cách 2: giao tiếp c|c ch}n gpio trực tiếp từ không
gian người dùng (user space) dựa trên API thư viện gpiolib cung cấp. Linux cung cấp giao diện GPIO sysfs cho phép thao t|c với bất kỳ ch}n GPIO từ userspace.
Lập trình nhúng ARM-Linux
75
Lập trình giao tiếp GPIO mở rộng
Tất cả c|c giao diện điều khiển GPIO thông qua sysfs
nằm trong thư mục /sys/class/gpio Kiểm tra bằng lệnh: ls /sys/class/gpio
Lập trình nhúng ARM-Linux
76
Lập trình giao tiếp GPIO mở rộng
Giao diện n{y cung cấp c|c files điều khiển sau đ}y:
Lập trình nhúng ARM-Linux
77
Lập trình giao tiếp GPIO mở rộng
Cấu hình chân GPF5 (micro2440) output, và xuất giá trị 0 ra chân này echo 165 > /sys/class/gpio/export echo “out” > /sys/class/gpio/gpio165/direction echo 0 > /sys/class/gpio/gpio165/value
Ví dụ minh họa Chi tiết xem b{i viết: https://sites.google.com/site/embedded247/ddcour se/giao-tiep-gpio-tu-userspace-1
Lập trình nhúng ARM-Linux
78
Thảo luận
Lập trình nhúng ARM-Linux
79