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