Nắm được kiến trúc tổng quan, đặc điểm v{ hoạt
động của một hệ nhúng.
Biết thiết kế hệ nhúng cơ bản (nguyên lý, mạch)
Nắm được kiến trúc vi điều khiển
Biết lập trình vi điều khiển từ cơ bản đến n}ng cao
với c|c dòng vi điều khiển phổ biến.
Nghiên cứu ph|t triển hệ nhúng ARM Linux với c|c
giao tiếp v{o ra cơ bản, n}ng cao, cơ chế x}y dựng
device driver
334 trang |
Chia sẻ: Mr Hưng | Lượt xem: 823 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Kỹ thuật máy tính - Hệ nhúng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
t + KIT) qua cáp chéo và sử dụng IP
cùng dải:
• Linux host: 192.168.1.30
• Linux target: 192.168.1.230 (default)
246
Embedded System HungPN-HUST
Ví dụ chương trình Hello
Soạn thảo m~ nguồn chương trình (sử dụng gedit,
eclipse, v.v)
247
#include
int main (int argc, char* argv[])
{
printf (“Ten chuong trinh la „%s‟.\n”, argv[0]);
printf (“Chuong trinh co %d tham so \n”, argc - 1);
/* Neu co bat cu tham so dong lenh nao*/
if (argc > 1) {
/* Thi in ra*/
int i;
printf (“Cac tham so truyen vao la:\n”);
for (i = 1; i < argc; ++i)
printf (“ Tham so %d: %s\n”, i, argv[i]);
}
return 0;
}
Embedded System HungPN-HUST
Biên dịch chéo chương trình
Cách 1: Sử dụng lệnh của cross compiler
• VD: arm-linux-gcc –o Hello Hello.c
• Kết quả: biên dịch ra một file thực thi có tên là Hello từ một
file mã nguồn là Hello.c, file này có hỗ trợ khả năng debug
Cách 2: Tạo và sử dụng Makefile
• make là một tool cho phép quản lý quá trình biên dịch, liên
kết của một dự án với nhiều file mã nguồn.
• Tạo Makefile lưu các lệnh biên dịch theo định dạng của
Makefile
• Sử dụng lệnh make để chạy Makefile và biên dịch chương
trình
248
Embedded System HungPN-HUST
Cấu trúc Makefile
Makefile cấu th{nh từ c|c target, variables v{
comments
Target có cấu trúc như sau:
target: dependencies
[tab] system command
target: make target
Dependencies: c|c th{nh phần phụ thuộc (file m~
nguồn, c|c file object)
System command: c|c c}u lệnh (lệnh biên dịch, lệnh
linux)
249
Embedded System HungPN-HUST
Ví dụ Makefile đơn giản
CC=arm-linux-gcc
all: Hello.c
$(CC) –o Hello Hello.c
clear:
rm Hello
Biên dịch chương trình: make all
Xóa file sinh ra trước đó: make clear
250
Embedded System HungPN-HUST
Đưa chương trình lên KIT
Sử dụng phần mềm gFTP kết nối host v{ KIT
251
Embedded System HungPN-HUST
5.3. Lập trình Arm Linux
5.3.1. Cơ chế giao tiếp thiết bị
5.3.2. Lập trình giao tiếp vào ra cơ bản
5.3.3. Lập trình RS232 trên Linux
5.3.4. Lập trình giao tiếp usb joystick
5.3.5. Lập trình device driver
252
Embedded System HungPN-HUST
5.3.1. Cơ chế giao tiếp thiết bị
Phần mềm ứng dụng
Device files
Device Drivers
Phần cứng
User Space
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)
Các hàm giao tiếp chuẩn:
•open
•close
•read
•write
•ioctl
•
253
Mô hình giao tiếp ứng dụng – thiết bị trên hệ điều h{nh
Embedded System HungPN-HUST
Cơ chế giao tiếp thiết bị
File thiết bị (device file): Hệ điều h{nh đối xử với c|c
thiết bị ngoại vi phần cứng tương tự như c|c file dữ
liệu thông thường.
Qu| trình ứng dụng giao tiếp với thiết bị l{ qu| trình
đọc/ghi file thiết bị đó thông qua driver.
Linux quản lý c|c file thiết bị trong thư mục /dev (Sử
dụng lệnh ls –l /dev để xem)
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 dữ liệu
(Đứng trên phương diện giao tiếp của driver)
254
Embedded System HungPN-HUST
Cơ chế giao tiếp thiết bị
Để quản lý c|c file thiết bị, hệ điều h{nh sử dụng số
hiệu định danh device number cho mỗi thiết bị. Số
hiệu n{y gồm 2 gi| trị:
• Major device number: X|c định thiết bị n{y sử dụng
driver nào
• Minor device number: ph}n biệt giữa c|c thiết bị
kh|c nhau sử dụng cùng một driver
255
Embedded System HungPN-HUST
Cơ chế giao tiếp thiết bị
Kiểm tra danh s|ch c|c thiết bị
• C|c file thiết bị (device file) nằm trong thư mục /dev
• Gõ lệnh ls –al /dev
• Các thông tin:
Loại thiết bị: character (c) hay block (b) device
T{i khoản người dùng
Tên thiết bị
Major number và Minor number
Mount point
256
Embedded System HungPN-HUST
Cơ chế giao tiếp thiết bị
Cơ chế lập trình giao tiếp:
• Sử dụng cơ chế giao tiếp file v{ c|c h{m do driver
cung cấp
• C|c h{m mở đóng file thiết bị: open, close
• H{m điều khiển cổng v{o ra: ioctl
• H{m đọc/ghi file thiết bị: read, write
•
• Được qui định trong cấu trúc file operations của
driver.
257
Embedded System HungPN-HUST
5.3.2. Lập trình giao tiếp vào ra cơ bản
Lập trình giao tiếp GPIO
A. Lập trình giao tiếp LED
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)
258
https://sites.google.com/site/embedded247/
escourse/gpioprogramming
Embedded System HungPN-HUST
Mô hình giao tiếp điều khiển led
Phần mềm ứng dụng
Device files
Device Drivers
Phần cứng
leds.c
/dev/leds
Mini2440_leds.c
GPIO Port
(GPB5,6,7,8)
Hàm giao tiếp:
• open
• close
• ioctl
259
Embedded System HungPN-HUST
Lập trình điều khiển led
Mở file thiết bị: fd=open(“/dev/leds”, 0)
• fd: file description (int, định danh file thiết bị)
• /dev/leds: device file name (tên file thiết bị)
• 0: WRITE_ONLY (chế độ mở để ghi)
H{m điều khiển ioctl(fd, onoff, led_no)
• ioctl: input output control (out 0, 1)
• Điều khiển bật/tắt led đơn có số hiệu led_no
M~ nguồn driver cho led đơn:
linux-2.6.32.2/drivers/char/mini2440_leds.c
260
Embedded System HungPN-HUST
M~ nguồn minh họa
261
#include
#include
#include
#include
int main(int argc, char **argv){
int on;
int led_no; int fd;
//Nhận tham số từ dòng lệnh, kiểm tra điều kiện tham số hợp lệ
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 ||
sscanf(argv[2],"%d", &on) != 1 || on 1 || led_no 3) {
fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
//Mở file thiết bị leds
fd = open("/dev/leds", 0);
if (fd < 0) {
perror("error open device leds\n");
exit(1);
}
ioctl(fd, on, led_no); //Điều khiển bật/tắt led có số hiệu led_no
close(fd); //Đóng file thiết bị
return 0;
}
Embedded System HungPN-HUST
Minh họa giao tiếp v{o ra cơ bản
B. Lập trình giao tiếp nút bấm
Giao tiếp qua driver đ~ có
Đọc trạng th|i c|c nút bấm sử dụng phương ph|p
thăm dò (polling)
262
Embedded System HungPN-HUST
Mô hình giao tiếp nút bấm
Phần mềm ứng dụng
Device files
Device Drivers
Phần cứng
Buttons.c
/dev/buttons
Mini2440_buttons.c
GPIO Port
Hàm giao tiếp:
•open
•close
•read
263
Embedded System HungPN-HUST
Lập trình giao tiếp nút bấm
Mở file thiết bị:
buttons_fd=open(“/dev/buttons”, O_RDONLY)
• buttons_fd: file description
• /dev/buttons: device file
H{m đọc dữ liệu
read(buttons_fd, current_buttons,
sizeof(current_buttons))
• Đọc trạng th|i c|c nút bấm
H{m đóng file thiết bị: close(buttons_fd)
M~ nguồn driver cho nút bấm
linux-2.6.32.2/drivers/char/mini2440_buttons.c
264
Embedded System HungPN-HUST
M~ nguồn minh họa
265
#include
int main(void){
int buttons_fd; char buttons[6] = {'0', '0', '0', '0', '0', '0'};
buttons_fd = open("/dev/buttons", O_RDONLY);
if (buttons_fd < 0) {
perror("open device buttons");
exit(1);}
for (;;) {
char current_buttons[6]; int count_of_changed_key; int i;
if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof
current_buttons) { perror("read buttons:"); exit(1);}
count_of_changed_key = 0;
for (i = 0; i < sizeof buttons / sizeof buttons[0]; i++) {
if (buttons[i] != current_buttons[i]) {
buttons[i] = current_buttons[i];
printf("%skey %d is %s", count_of_changed_key? ", ": "", i+1,
buttons[i] == '0' ? "up" : "down");
count_of_changed_key++;}
}
if (count_of_changed_key) printf("\n");
}
close(buttons_fd); return 0;}
Embedded System HungPN-HUST
Lập trình giao tiếp sử dụng gpiolib
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.
266
Embedded System HungPN-HUST
Lập trình giao tiếp sử dụng gpiolib
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
267
Embedded System HungPN-HUST
Lập trình giao tiếp sử dụng gpiolib
Giao diện n{y cung cấp c|c files điều khiển sau đ}y:
268
Embedded System HungPN-HUST
Lập trình giao tiếp GPIO sử dụng gpiolib
Minh họa giao tiếp gpiolib sử dụng linux command
Chi tiết:
https://sites.google.com/site/embedded247/ddcour
se/giao-tiep-gpio-tu-userspace-1
269
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
Embedded System HungPN-HUST
Minh họa lập trình giao tiếp gpiolib
File gpio.h
270
#ifndef GPIO_H
#define GPIO_H
int gpio_export(unsigned int gpio); //export pin to user space
int gpio_unexport(unsigned int gpio); //unexport pin from user
space
int gpio_dir_out(unsigned int gpio); //Config pin as output
int gpio_dir_in(unsigned int gpio); //Config pin as input
int gpio_set_value(unsigned int gpio, unsigned int value); //Ghi
gia tri cua mot pin gpio output
int gpio_get_value(unsigned int gpio, unsigned int *value); //Doc
gia tri cua mot pin gpio input
int gpio_set_edge(unsigned int gpio, char *edge);
#endif
Embedded System HungPN-HUST
Minh họa lập trình giao tiếp gpiolib
File gpio.c (ví dụ h{m đăng ký ch}n gpio sử dụng)
271
int gpio_export(unsigned int gpio){
int fd, len;
char buf[64];
fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd < 0) {
perror("gpio/export");
return fd;
}
len = snprintf(buf, sizeof(buf), "%d", gpio);
write(fd, buf, len);
//Ghi gpio vao file export
close(fd);
return 0;
}
Embedded System HungPN-HUST
Demo: Ứng dụng giao tiếp Board mở rộng, điều
khiển led đơn, 7 seg, buttons.
272
Minh họa lập trình giao tiếp gpiolib
Embedded System HungPN-HUST
5.3.3. Lập trình RS232 trên Linux
Giới thiệu chuẩn RS232
Lập trình giao tiếp RS232 trên Linux
273
Embedded System HungPN-HUST
Chuẩn RS232
Chuẩn đấu nối trên PC
UART UART
UART (Universal Asynchronous receiver/transmitter)
274
Embedded System HungPN-HUST
Chuẩn RS232
Chuẩn đầu nối trên PC
• Chân 1 (DCD-Data Carrier Detect):
phát hiện tín hiệu mang dữ liệu
• Chân 2 (RxD-Receive Data): nhận dữ
liệu
• Chân 3 (TxD-Transmit Data): truyền
dữ liệu
• Chân 4 (DTR-Data Terminal Ready):
đầu cuối dữ liệu sẵn sàng
• Chân 5 (Signal Ground): đất của tín
hiệu
• Chân 6 (DSR-Data Set Ready): dữ liệu
sẵn sàng
• Chân 7 (RTS-Request To Send): yêu
cầu gửi
• Chân 8 (CTS-Clear To Send): Xóa để
gửi
• Chân 9 (RI-Ring Indicate): báo chuông
275
Embedded System HungPN-HUST
Chuẩn RS232
Khuôn dạng khung truyền
• PC truyền nhận dữ liệu qua cổng nối tiếp RS-232 thực
hiện theo kiểu không đồng bộ (Asynchronous)
• Khung truyền gồm 4 thành phần
1 Start bit (Mức logic 0): bắt đầu một gói tin, đồng bộ xung
nhịp clock giữa DTE và DCE
Data (5,6,7,8 bit): dữ liệu cần truyền
1 parity bit (chẵn (even), lẻ (odd), mark, space): bit cho phép
kiểm tra lỗi
Stop bit (1 hoặc 2 bit): kết thúc một gói tin
276
Embedded System HungPN-HUST
Chuẩn RS232
Kịch bản truyền
Ghép nối không bắt tay giữa hai thiết bị
(Khác nhau về mức điện áp)
277
Embedded System HungPN-HUST
Lập trình giao tiếp chuẩn RS232 trên Linux
C|c bước cơ bản gồm:
• Khởi tạo: Khai b|o thư viện
• Bước 1: Mở cổng COM
• Bước 2: Thiết lập tham số cấu hình cổng COM
• Bước 3: Đọc/ghi cổng (gửi/nhận dữ liệu)
• Bước 4: Đóng cổng
278
Embedded System HungPN-HUST
Khai b|o thư viện
#include
#include
#include
#include // UNIX standard function
#include // File control definitions
#include // Error number definitions
#include // POSIX terminal control
#include // time calls
279
Embedded System HungPN-HUST
Bước 1: Mở cổng
Sử dụng lệnh mở file
int fd = open ("/dev/ttySAC0", O_RDWR);
“/dev/ttySAC0”: Tên file thiết bị cổng COM muốn
mở
fd >0 nếu mở file th{nh công
fd<0 nếu mở file thất bại
280
Embedded System HungPN-HUST
Bước 2: Thiết lập tham số
Sử dụng cấu trúc termios
struct termios port_settings;
Thiết lập tham số (9600, 8, n, 1)
cfsetispeed(&port_settings, B9600);
cfsetospeed(&port_settings, B9600);
port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &port_settings);
281
Embedded System HungPN-HUST
Bước 3: Đọc, ghi cổng
Đọc cổng: sử dụng lệnh đọc file
n=read(fd,&result,sizeof(result));
N: số ký tự đọc được
Result: chứa kết quả
Ghi cổng: sử dụng lệnh ghi file
n=write(fd,“Hello World\r",12);
N:số ký tự đ~ ghi
fd: file id (có được từ thao t|c mở file th{nh công)
282
Embedded System HungPN-HUST
Bước 4: Đóng cổng
Đóng cổng: sử dụng lệnh đóng file
close (fd);
fd: file ID (có được từ thao t|c mở file th{nh công)
https://sites.google.com/site/embedded247/esco
urse/rs232programming
283
Demo
Embedded System HungPN-HUST
5.3.4. Lập trình giao tiếp usb
Tìm hiểu giao thức USB
Lập trình giao tiếp thiết bị usb joystick
284
Embedded System HungPN-HUST
Tìm hiểu giao thức usb
Giới thiệu chuẩn USB:
Năm 1995: USB 1.0
• Tốc độ Low-Speed: 1.5 Mbps
• Tốc độ tối đa (Full-Speed): 12 Mbps
Năm 1998: USB 1.1 (Sửa lỗi của USB 1.0)
• Tốc độ tối đa (Full-Speed): 12 Mbps
Năm 2001: USB 2.0
• Tốc độ tối đa (High-Speed): 480 Mbps
Năm 2008: USB 3.0
• Tốc độ tối đa (Super-Speed): 4.8 Gbps
Tín hiệu
• Truyền kiểu nối tiếp
• Tín hiệu trên hai đường D+ và D- là tín hiệu vi sai
285
Embedded System HungPN-HUST
Mô hình bus USB
286
Embedded System HungPN-HUST
Vai trò của c|c th{nh phần
Vai trò của USB host:
• Trao đổi dữ liệu với c|c thiết bị ngoại vi
• Điều khiển bus:
Quản lý được c|c thiết bị kết nối v{o đường bus v{
khả năng của mỗi thiết bị đó: sử dụng cơ chế điểm
danh (Enumeration)
Ph}n xử, quản lý luồng dữ liệu trên bus, đảm bảo c|c
thiết bị đều có cơ hội trao đổi dữ liệu
• Kiểm tra lỗi: thêm c|c m~ kiểm tra lỗi v{o gói tin
cho phép ph|t hiện lỗi v{ yêu cầu truyền lại gói tin
• Cung cấp nguồn điện cho tất cả c|c thiết bị
287
Embedded System HungPN-HUST
Vai trò của c|c th{nh phần
Vai trò của thiết bị ngoại vi
• Trao đổi dữ liệu với host
• Ph|t hiện c|c gói tin hay yêu cầu (request) được gửi
tới thiết bị để xử lý phù hợp
• Kiểm tra lỗi: tương tự như Host, c|c thiết bị ngoại vi
cũng phải chèn thêm c|c bit kiểm tra lỗi v{o gói tin
gửi đi
• Quản lý nguồn điện: c|c thiết bị có thể sử dụng
nguồn điện ngo{i hay nguồn từ bus. Nếu sử dụng
nguồn từ bus, thường có chế độ tiết kiệm điện năng.
288
Embedded System HungPN-HUST
Endpoint & pipes
Mỗi qu| trình truyền nhận dữ liệu bao gồm một
hay nhiều giao dịch (transactions), mỗi giao dịch
gồm một hay nhiều packets
-> Để hiểu được c|c giao dịch, c|c packet v{ nội dung
của chúng -> cần tìm hiểu hai kh|i niệm Endpoint
và Pipes
289
Embedded System HungPN-HUST
Endpoint
Endpoint của thiết bị:
• L{ “điểm cuối” trong kênh giao tiếp giữa host v{ usb
device.
• Endpoint l{ bộ đệm (gửi, nhận) nằm trên thiết bị.
• C|c Endpoint được đ|nh địa chỉ v{ x|c định hướng
In Endpoint: bộ đệm gửi (host lấy dữ liệu về)
Out Endpoint: bộ đệm nhận (host gửi dữ liệu v{o)
• Tất cả c|c thiết bị đều phải có Endpoint 0, đ}y l{
endpoint mặc định để gửi c|c thông tin điều khiển
290
Embedded System HungPN-HUST
Endpoint
291
Embedded System HungPN-HUST
Pipes
Pipes: kết nối Endpoint của thiết bị tới Host
• Phải thiết lập pipe trước khi muốn trao đổi dữ liệu
• Host thiết lập pipe trong qu| trình điểm danh
(Enumeration)
• C|c Pipe sẽ được hủy khi thiết bị ngắt kết nối khỏi
bus
• Tất cả c|c thiết bị đều có một đường ống điều khiển
(control pipe) mặc định sử dụng Endpoint 0
292
Embedded System HungPN-HUST
Device Classes
C|c thiết bị ngoại vi chuẩn (chuột, m|y in, ổ nhớ flash) có
đặc tính truyền nhận dữ liệu chung -> Hệ điều h{nh có thể
cung cấp driver chung cho c|c nhóm, c|c nh{ sản xuất thiết
bị không cần viết driver riêng.
C|c thiết bị đặc thù riêng: cần có driver từng loại
C|c nhóm thiết bị đ~ được định nghĩa
• Audio
• Communication devices
• Human interface (HID)
• IrDA Bridge
• Mass Storage
• Cameras and scanners
• Video
293
Embedded System HungPN-HUST
Qu| trình trao đổi dữ liệu
C|c thiết bị USB có thể trao đổi dữ liệu với Host
theo 4 kiểu ho{n to{n kh|c nhau, cụ thể:
• Truyền điều khiển (control transfer)
• Truyền ngắt (interrupt transfer)
• Truyền theo khối (bulk transfer)
• Truyền đẳng thời (isochronous transfer)
294
Embedded System HungPN-HUST
C|c kiểu truyền
Truyền điều khiển: để điều khiển phần cứng, c|c
yêu cầu điều khiển được truyền. Chúng l{m việc
với mức ưu tiên cao v{ với khả năng kiểm so|t lỗi
tự động. Tốc độ truyền lớn vì có đến 64 byte trong
một yêu cầu (request) có thể được truyền.
Truyền ngắt: c|c thiết bị, cung cấp một lượng dữ
liệu nhỏ, tuần ho{n chẳng hạn như chuột, b{n phím
đều sử dụng kiểu truyền n{y. Hệ thống sẽ hỏi theo
chu kỳ, chẳng hạn 10ms một lần xem có c|c dữ liệu
mới gửi đến.
295
Embedded System HungPN-HUST
C|c kiểu truyền
Truyền theo khối: khi có lượng dữ liệu lớn cần
truyền v{ cần kiểm so|t lỗi truyền nhưng lại không
có yêu cầu thúc ép về thời gian truyền thì dữ liệu
thường được truyền theo khối. VD: m|y in, m|y
quét
Truyền đẳng thời: khi có khối lượng dữ liệu lớn
với tốc độ dữ liệu đ~ được quy định, ví dụ như card
}m thanh. Theo c|ch truyền n{y một gi| trị tốc độ
x|c định được duy trì. Việc hiệu chỉnh lỗi không
được thực hiện vì những lỗi truyền lẻ tẻ cũng
không g}y ảnh hưởng đ|ng kể.
296
Embedded System HungPN-HUST
Lập trình giao tiếp thiết bị USB Joystick
297
https://sites.google.com/site/embedded247
/escourse/joystickprogramming
Embedded System HungPN-HUST
Cấu trúc js_event trên Linux
Linux định nghĩa cấu trúc js_event để lưu c|c thông
tin khi có ph|t sinh sự kiện (khởi tạo thiết bị,
người dùng bấm nút chức năng, nút chỉnh hướng)
Định nghĩa trong include/linux/joystick.h
298
Embedded System HungPN-HUST
Cấu trúc js_event
Nội dung c|c trường dữ liệu
• Time: nh~n thời gian ph|t sinh sự kiện
• Value: gi| trị, phụ thuộc v{o nút chức năng hay nút chỉnh
hướng
Nếu l{ nút chức năng: 0/1 (1: pressed, 0: released)
Nếu l{ nút chỉnh hướng: -32768 -> 32767
(Ph}n biệt hướng x, y phụ thuộc v{o gi| trị number=0/1)
• Type: loại sự kiện
Khởi tạo thiết bị: 0x80
Nút chỉnh hướng: 0x02
Nút chức năng: 0x01
• Number: x|c định nút được nhấn (trường hợp type =1 hoặc
x|c định nút chỉnh hướng x, y trong trường hợp type =2)
299
Embedded System HungPN-HUST
Lập trình kết nối joystick
Mở file thiết bị:
joystick_fd = open(JOYSTICK_DEVNAME,
O_RDONLY | O_NONBLOCK);
JOYSTICK_DEVNAME: tên của file thiết bị, thường
là /dev/input/js0
O_RDONLY | O_NONBLOCK: mở file chỉ đọc ở chế
độ NONBLOCK
300
Embedded System HungPN-HUST
Lập trình kết nối joystick
Đọc dữ liệu từ thiết bị (khi có ph|t sinh sự
kiện)
bytes = read(joystick_fd, jse, sizeof(*jse));
joystick_fd: con trỏ file có được khi mở file
jse: biến cấu trúc js_event
bytes: Tổng số file đọc được, nếu số n{y bằng kích
thước của cấu trúc js_event thì qu| trình đọc th{nh
công
301
Embedded System HungPN-HUST
Demo giao tiếp usb joystick
Các sự kiện khi khởi tạo thiết bị
302
Embedded System HungPN-HUST
Demo giao tiếp usb joystick
Các sự kiện khi người dùng nhấn các nút
303
Embedded System HungPN-HUST
QT Joystick Demo
304
Embedded System HungPN-HUST
5.3.5. Lập trình Device Driver
Giới thiệu về Kernel Module
Cơ chế x}y dựng Device Driver
305
Embedded System HungPN-HUST
Kernel Module
Hoạt động trên Kernel Space, có thể truy xuất tới
c|c t{i nguyên của hệ thống
Kernel Module cho phép thêm mới c|c module một
c|ch linh hoạt, tr|nh việc phải biên dịch lại nh}n hệ
điều h{nh
Kernel Module l{ cơ chế hữu hiệu để ph|t triển c|c
device driver
Xem danh s|ch c|c module đang chạy: lsmod
306
Embedded System HungPN-HUST
Kernel Module
C|c bước để thêm một kernel module v{o hệ thống
• Viết m~ nguồn: chỉ sử dụng c|c thư viện được cung
cấp bởi kernel, không sử dụng được c|c thư viện
bên ngoài
• Biên dịch m~ nguồn module
• C{i đặt module: dùng lệnh
insmod Tên_Module.ko
• Gỡ module: dùng lệnh rmmod Tên_Module
• Xem c|c thông tin log: sử dụng System Log Viewer
307
Embedded System HungPN-HUST
M~ nguồn kernel module
308
//File: hello_kernel_module.c
#include
#include
#include
static int hello_init(void)
{
printk(KERN_ALERT "Khoi tao thanh cong\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Ket thuc thanh cong\n");
}
module_init(hello_init);
module_exit(hello_exit);
Embedded System HungPN-HUST
Viết Makefile biên dịch kernel module
Biên dịch bằng lệnh make được file
hello_kernel_module.ko
Kernel Module Makefile
obj-m += hello_kernel_module.o
all:
make -C /lib/modules/$(shell uname -r)/build
M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build
M=$(PWD) clean
309
Embedded System HungPN-HUST
C{i đặt kernel module v{o hệ thống
Cài đặt module v{o hệ thống (runtime) sử dụng
lệnh insmod
insmod hello_kernel_module .ko
Gỡ kernel module dùng lệnh rmmod
Trên Ubuntu để kiểm tra qu| trình c{i đặt xem
module đ~ c{i đặt th{nh công hay chưa mở
System/Log Viewer xem mục kernel log)
310
Embedded System HungPN-HUST
Lập trình linux device driver
Sử dụng cơ chế lập trình kernel module để x}y
dựng c|c device driver
Qui trình x}y dựng device driver:
• Viết m~ nguồn (cấu trúc tương tự kernel module).
• Biên dịch m~ nguồn (dùng Makefile) (được file .ko)
• C{i đặt sử dụng lệnh insmod
• Đăng ký tên file thiết bị (device file) với hệ thống
Đăng ký tự động trong m~ nguồn
Hoặc sử dụng lệnh mknod để tạo device file (trong
thư mục /dev)
mknod [options] NAME Type [Major Minor]
311
Embedded System HungPN-HUST
Ví dụ: Hello Driver
312
Embedded System HungPN-HUST
Tham khảo + Demo
Demo
313
https://sites.google.com/site/embedded247/ddcourse/
kernelmoduleprogramming
Embedded System HungPN-HUST
5.4. Lập trình nền tảng Qt
5.4.1. Giới thiệu Qt
5.4.2. Cài đặt môi trường phát triển Qt
5.4.3. Làm quen với lập trình Qt
314
Embedded System HungPN-HUST
5.4.1. Giới thiệu Qt
Qt Development Frameworks được sáng lập năm 1994
bởi TrollTech
2008: TrollTech sáp nhập vào Nokia
Hiện nay Qt thuộc sở hữu của Digia
Qt l{ một Framework ph|t triển ứng dụng đa nền tảng
(desktop, mobile, embedded).
Hỗ trợ các nền tảng: Windows, Linux, Embedded
Linux, Win CE, Symbian, Maemo
315
Embedded System HungPN-HUST
Giới thiệu QT
Qt cho phép viết ứng dụng một lần v{ biên dịch chéo
trên nhiều nền tảng hệ điều h{nh khác nhau mà không
phải viết lại m~. Tuy nhiên, m~ nguồn cần được biên
dịch trên nền tảng m{ muốn ứng dụng được thực thi.
Lập trình Qt theo chuẩn C++.
Qt Framework bao gồm:
• a cross-platform class library (Thư viện c|c lớp hướng
đối tượng)
• integrated development tools (C|c công cụ ph|t triển
tích hợp)
• a cross-platform IDE. (Môi trường ph|t triển ứng dụng)
Tham khảo: qt.nokia.com; qtcentre.org
316
Embedded System HungPN-HUST
QT được sử dụng rộng r~i
317
Embedded System HungPN-HUST
Kiến trúc Qt
318
Embedded System HungPN-HUST
5.4.2. Cài đặt Qt SDK
Cài đặt Qt SDK trên máy phát triển (Linux,
Windows, MacOS)
File cài đặt
qt-sdk-linux-x86-opensource-2010.05.1.bin
Phiên bản mới:
Thực thi file cài đặt:
$ ./qt-sdk-linux-x86-opensource-2010.05.1.bin
Đợi qu| trình c{i đặt diễn ra th{nh công, mặc định
thư mục c{i đặt chứa tại
$HOME/qtsdk-2010.01/qt/bin
319
Embedded System HungPN-HUST
C{i đặt Qt SDK
Sau khi c{i đặt xong Qt SDK, công cụ Qt Creator cho
phép ph|t triển ứng dụng với lựa chọn mặc định
biên dịch trên m|y tính Linux.
Để biên dịch chéo ứng dụng thực thi trên KIT
FriendlyArm (Embedded Linux) cần c{i đặt Qt
Everywhere
https://sites.google.com/site/embedded247/esco
urse/qtinstall
320
Embedded System HungPN-HUST
Cài đặt Qt Everywhere
Bước 1: Cài đặt QT Em
Các file đính kèm theo tài liệu này:
- baigianghenhung_4539.pdf