Với kernel 2.6 và hệ thống có hỗ trợ USB host full speed 2.0 vẫn chạy ngon lành là có thể áp chạy được, và ta có thể khám phá một số điều thú vị về mảng này.. Đối với hệ thống nhúng, ta
Trang 1Giao tiếp USB Webcam,
Camera
Trang 2MỤC LỤC
Giao tiếp USB Webcam, Camera 1 MỤC LỤC 2 1.Giới thiệu lập trình Nhúng 32
Giao tiếp USB Webcam, Camera
Có nhiều bạn hỏi mua một số loại camera chuyên dụng như UART camera, ISI image sensor Những loại này đặc biệt, chỉ có bán ở nước ngoài và giá cỡ trăm USD không kể tiền ship Tại sao ta không tận dụng những USB camera có sẵn của máy vi tính? Giá cỡ 150-250K, thấp không thể tin được !!! Ta chỉ cần trang bị một số kiến thức về Linux embedded system, như vậy có thể sử dụng ngon lành những thứ có sẵn này rồi
Với kernel 2.6 và hệ thống có hỗ trợ USB host (full speed 2.0 vẫn chạy ngon lành) là có thể áp chạy được, và ta có thể khám phá một số điều thú vị về mảng này
Ở máy tính, có thể kernel được build sẵn driver cho các loại USB camera thông thường Đối với hệ thống nhúng, ta cần cấu hình và build driver này, các bước cấu hình cho linux-2.6.27 (áp dụng cho KM9260) được thực hiện như sau:
Code:
Code:
$ cd linux-2.6.27
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
Cấu hình kernel như sau:
Code:
Code:
Device Driver ->
Trang 3Multimedia devices ->
<*> Video For Linux [*] Enable Video For Linux API 1 (DEPRECATED)
[*] Video capture adapters ->[*] V4L USB devices ->
<*> USB Video Class (UVC)[*] UVC input events device support
<*> USB GSPCA driver
Sau khi cấu hình xong, build uImage và reboot hệ thống:
Đối với board nhúng KM9260 không hỗ trợ GLCD display, làm sao hiển thị kết quả thu được từ USB camera ? Có 2 giải pháp:
1> Hiển thị lên X server chạy trên máy tính, lúc này ta cần phải export biến môi trường DISPLAY
2> Stream kết quả lên trang web, dùng trình duyệt FireFox để hiển thị
Ta sử dụng cách thứ 2 băng cách download source chương trình ứng dụng ở link sau:
Trang 4http://linux.softpedia.com/progDownl oad-34273.html
Trang 5Sau khi build và chạy chương trình ứng dụng ta có kết quả sau:
Trang 7Thêm nữa, hiện nay các module wireless hỗ trợ cho hệ thống VĐK bao gồm các module ZigBee Nhưng giá thành vẫn còn đắt đỏ, có vẽ còn xa vời Tuy nhiên, hiện nay trên thị trường vi tính hiện nay xuất hiện USB Wireless apdapter có nhãn hiệu Tenda W541U V2.0, chuẩn G 54Mbps, giá cỡ dưới 200K tùy vào chỗ bán Không may, theo trang web của Tenda họ nói chỉ hỗ trợ cho Windows, không hỗ trợ cho Linux Gắn USB adapter này vào hệ thống, dùng lệnh "lsusb -vv" nó hiện ra chipset của Ralink Sau 2 ngày vò đầu bức tóc, xào nấu cuối cùng K cũng làm cho nó chạy được với KM9260 Do source kernel không hỗ trợ driver cho loại chipset này vì vậy việc build driver theo kiểu external module là điều cần thiết Để làm điều đó cần phải cấu hình lại kernel, add phần mục hỗ trợ wireless.
Code:
Code:
Vendor, chip ID: 0x148F,0x2070
Chipset: Ralink 2070L
Trang 8Device Driver ->[*] Network device support ->
Wireless LAN ->[*] Wireless LAN (IEEE 802.11)
<*> IEEE 802.11 for host AP [*] Support for downloading firmware images with host AP driver[*] Support for non-volatile firmware download
Trang 9Chào bạn,
Trang 10Câu hỏi của bạn khá thú vị đấy, manual thực chất là tài liệu mô tả đặc tính, tài nguyên của board hiện có Về phần lập trình biên dịch, load chương trình để chạy, K sẽ đề cập ở tài liệu khác (Technical reference) hiện nay tài liệu này chưa được công bố.
Về việc điều khiển các thiết bị, đòi hỏi bạn phải có kiến thức về hệ điều hành Linux, tức
là làm việc có liên quan đến driver Vấn đề này nó trở thành kiến thức chung và được cộng đồng phát triển Linux tài liệu hóa và công bố trên mạng internet Đối với Linux không đơn thuần viết code C set các thanh ghi của CPU như kiểu lập trình VĐK thông thường Người phát triển viết các chương trình ứng dụng tác động đến driver và điều khiển các thiết bị theo mong muốn Điều này được thực hiện thông qua các hàm API và được gọi là system call
Về ngôn ngữ lập trình thì, nếu làm việc với kernel, driver thì bắc buộc phải dùng ngôn ngữ C Còn đối với các chương trình ứng dụng chạy trên Linux có thể được viết bằng những ngôn ngữ khác (đi kèm với trình biên dịch tương ứng)
Về trình biên dịch, nó sẽ là gcc nếu bạn dùng ngôn ngữ C Nếu bạn có kiến thức cơ bản
về Linux, thì khi đọc manual của km9260 bạn sẽ biết trình biên dịch nó được trình bày ở mục nào Có lẽ hiện nay các trường đại học chưa đưa embedded Linux vào chương trình giảng dạy Vì thế việc truyền thụ kiến thức gặp nhiều khó khăn K có ý định hỗ trợ cho một số giảng viên trong trường đại học Sư Phạm Kỹ Thuật với mong muốn phổ cập embedded Linux cho cộng đồng
Theo ý kiến của K thì, nếu bạn muốn làm với embedded Linux thì cần có sự nỗ lực nhiều
từ phía bạn Bạn sẽ cần đến máy tính có kết nối internet dùng cho việc tìm kiếm thông tin, học hỏi nhiều kiến thức Theo kinh nghiệm của K thì chỉ cần có GOOGLE là đủ Khi muốn điều khiển cổng UART của hệ thống, bạn sẽ thấy hơi khó chịu thay vì truy xuất các thanh ghi cho con CPU theo kiểu truyền thống, ta phải tìm hiểu các hàm API trong Linux
Trang 11để điều khiển thiết bị này Tuy nhiêm việc này có lợi điểm bạn không cần phải ngồi đọc datasheet hàng trăm trang của con CPU đề tìm hiểu các thanh ghi điều khiển UART nó nằm ở chỗ nào Ngay cả con CPU AT91SAM9260 K vẫn chưa nắm hết các thanh ghi của
nó, điều khiển nó như thế nào Vì thực ra tìm hiểu hết những thứ này không mang lại ý nghĩa gì Vấn đề ở chỗ làm cách nào ta giải quyết nhanh được bài toán đã được đặc ra Linux có vẽ như là công việc của nhiều người hơn là công việc cá nhân
cám ơn anh đã giúp đỡ rất chi tiết!
Theo tôi nghi việc nắm vững phần cứng(đặc biệt là địa chỉ mà CPU cấp) có ý nghĩa hết sức quan trọng, nó cho ta hiểu một cách thấu đáo về những dòng code Driver mà cộng đồng Linux đã phát triển Có thể không hiểu hết được tất cả các dòng lệnh trong đó, nhưng về mặt ý tưởng ta có thể nắm được
Hơn thế nữa, tôi nhận thấy board của anh có rất nhiều I/O, vậy việc nắm phần cứng, địa chỉ phần cứng là một việc cần thiết khi ta tiến hành sử dụng các I/O cho những mục đích
Tôi có đọc qua tôi có câu hỏi cho anh được không a?
Tôi có đọc qua về Ecos và Redboot trong quá trình khởi động linux trong thời gian một vài giây Tại sao lại nhanh vậy? Trong khi tôi thấy quá trình khởi động của Linux không thể có được tốc độ như vậy, dẫu rằng anh có thể giảm thiểu tối đa các driver sử dụng
Trang 12Bạn tham khảo datasheet AT91SAM9260 trên trang ATMEL để thêm chi tiết
Nhiệm vụ của boot loader là thực hiện khởi động một số tài nguyên trên hệ thống, load file ảnh của hệ điều hành vào bộ nhớ, thực hiện giải nén file ảnh, trao cho hệ điều hành 1 vài tham số cần thiết (boot arg) và sau cùng là thực hiện lệnh nhảy để chạy hệ điều hành Đối với Linux thì hàm init được kích hoạt đầu tiên, rồi đến việc đăng ký driver, chạy các dịch vụ (deamon)
Boot loader chỉ chiếm thời gian khi load file ảnh kernel từ các thiết bị NAND Flash, MMC vào RAM Về phía Linux, tốc độ khởi động tùy thuộc vào s61 lượng driver, khởi động các dịch vụ trong quá trình boot Linux
Chính vì thế tốc độ boot không chỉ đơn thuần do boot loader quyết định mà nó còn phụ thuộc vào nhiều yếu tố khác
Theo K thì U-Boot là boot loader thông dụng nhất và được xài rộng rãi trong các hệ thống nhúng hiện nay
một vài chú ý khi thao tác trên KM9260::
- với rootfs debian thì bạn phải sử dụng thẻ nhớ >=2gb, và không nên dùng thẻ nhớ nhái của Tàu(không nhãn), nên dùng thẻ nhớ nào có nhãn hiệu vì có thể linux kernel sẽ không nhận biết được
- nếu bạn nào dùng colinux thì nên tạo root của mình có dung lượng lớn 1 tí, vì mình sẽ
Trang 13nó sẽ kết nối ngay thui
-> nói chung thì KM9260 được a P thiết kế rất tốt nên hầu như phần cứng không có sai sót nào cả
Để tìm hiểu thế nào là hệ thống nhúng, thế nào là lập trình nhúng chúng ta cần phải đầu
tư về thiết bị
Tuy nhiên, ở VN, hệ thống nhúng vẫn còn là khái niệm mới mẻ Việc tiếp cận với hệ thống nhúng cũng gặp khó khăn do ở VN không có sẵn các thiết bị phụ trợ Hệ thống nhúng không đơn thuần là hệ thống VĐK thông thường, được phát triển bởi 1 chương trình đơn lẻ Hệ thống nhúng thông thường có mặt hệ điều hành (gọi là hệ điều hành nhúng) Với xu hướng toàn cầu hóa hệ thống nhúng không chỉ là 1 sản phẩm làm ra từ một cá nhân, mà nó là hệ thống bao gồm hardware và sofware, là sản phẩm của nhiều người tạo ra
Với bối cảnh thị trường khởi đầu ở VN, EEES tìm ra cho mình hướng đi mới Hiểu được tầm quan trọng của lĩnh vực embedded Linux Cty mạnh dạn đầu tư với hy vọng phục vụ cho cộng đồng điện tử VN phát triển phần mềm nhúng
Vì sao embeddd Linux là sự lựa chọn cho chúng ta ?
Trang 14+ Chi phí thấp:
Do là nguồn mở nên việc đầu tư các tool phần mềm phát triển trở nên dễ dàng hơn và hầu như free, vì thế chi phí nghiên cứu phát triển cho dự án, chi phí sản xuất ra sản phẩm được giảm đáng kể
+ Tính năng mạnh :
Các thiết bị liên quan đến máy tính ví dụ như USB, Wifi, IEEE1394, Ethernet, PCI, UART, SPI Tất cả điều được Linux hỗ trợ, và số luợng driver trong linux kernel source đang được tăng dần theo thời gian
+ Hỗ trợ rất nhiều platform:
Hiện nay trên thế giới có rất nhiều chủng loại CPU với nhiều cấu trúc khác nhau Từ những cấu trúc CPU này, các nhà sản xuất hardware đã cho ra nhiều board nhúng khác nhau (gọi là platform, phần xác của hệ thống nhúng) Kernel Linux có thể tập hợp hàng chục cấu trúc CPU, hàng trăm platform này lại thành một hệ thống source C và ASM
Trang 15hoàn chỉnh Chính vì tính năng hỗ trợ nhiều platform và tính cấu hình cao tạo nên sức mạnh cho hệ điều hành Linux
+ Phổ dụng:
Khi ta search những từ khóa có liên quan đến Linux trên trang tìm kiếm Google thì số lượng kết quả rất lớn, điều này cho thấy cộng đồng phát triển Linux có số lượng người lớn Vì thế trong quá trình phát triển dự án về Linux ta vẫn an tâm bởi vì nguồn support rất dồi dào
T.Năm 17 Tháng 12, 2009 9:07 pm
T.Năm 17 Tháng 12, 2009 9:08 pm
CÀI ĐẶT DEBIAN CHO KM9260:
Đối với user mới làm quen với embedded Linux, thì Debian rootfs là lựa chọn hoàn hảo,
do tính ưu việt về số lượng lớn gói phần mềm mà Debian support, cơ chế quản lý các gói phần mềm chặt chẽ và hệ thống, cộng đồng phát triển rộng Debian rootfs có dung lượng khá lớn, vì thế ta nên dùng thẻ nhớ có dung lượng 2GB trở lên Phần này chỉ cách cài đặt
và boot Debian trên KM9260 sử dụng thẻ nhớ microSD
Trước tiên ta chép “Debian_km9260_rootfs_121209.tar.bz2” vào máy PC Linux, gắn đầu đọc thẻ microSD vào Giả sử khi cắm vào máy PC Linux có thiết bị mới có tên gọi là /dev/sdb1, trước tiên ta format card microSD theo định dạng ext2, và mount vào thư mục
“mnt/rootfs” chẳng hạn
Mã:
[color=#000000]$ mkfs.ext2 /dev/sdb1[/color]
Trang 16[color=#000000]$ mkdir –p /mnt/rootfs[/color]
[font=Times New Roman][color=#000000]$ mount /dev/sdb1 /mnt/rootfs[/color][/font]
Copy gói tarball Debian rootfs vào thư mục mnt và tiến hành giải nén
Mã:
[color=#000000]$ ls /mnt/rootfs[/color]
[font=Times New Roman][color=#000000]$ umount /mnt/rootfs[/color][/font]
Sau khi hoàn tất các bước trên, ta có thể tiến hành boot thử Debian:
- Gắn microSD vào socket trên KM9260 (chú ý thực hiện tháo gỡ nắp đậy theo chiều mũi lên kéo lên-xuống được ghi trên socket microSD của KM9260)
- Kết nối cổng COM (115200) với máy tính, dùng putty.exe ở mode serial làm console chính
- Bật công tắc nguồn, ấn nút reset để board KM9260 có thể vào màn hình U-Boot
- Khai báo biến môi trường bootargs thông qua lệnh sau:
Trang 17Ấn nút reset để boot hệ thống, thông tin đang nhập như sau:
Username: root
Password: km9260
T.Năm 17 Tháng 12, 2009 9:13 pm
Cấu hình mạng cho Debian:
Có thể cấu hình mạng cho Debian thông qua việc edit file interfaces
[color=#000000]iface eth0 inet dhcp[/color]
[color=#000000]pre-up ifconfig eth0 hw ether AA:AA:AA:AA:AA:AA[/color]
[u]
Trang 18Trong đó AA:AA:AA:AA:AA:AA là địa chỉ MAC address.
[color=#000000]iface eth0 inet static[/color]
[color=#000000] address 192.168.1.35[/color]
[color=#000000] netmask 255.255.255.0[/color]
[color=#000000] network 192.168.1.1[/color]
[color=#000000] broadcast 192.168.1.255[/color]
[size=3][font=Times New Roman][color=#000000] gateway 192.168.1.1[/color][/font][/size]
[color=#000000]$ nano /etc/resolv.conf[/color]
[size=3][font=Times New Roman][color=#000000] nameserver 192.168.1.1[/color][/font][/size]
[u]
Trang 19Lưu file bằng cách ấn CTR-O, Enter, CTR-X
Restart mang cho he thong
Các MPU trong các thệ thống VĐK thông thường có số lượng pin (có thể cấu hình thành external interrupt source) hạn chế Đối với hệ thống Linux, ta có thể sử dụng 1 pin GPIO thông thường như một external interrupt source Điều này có thể thực hiện bên kernel space Đối với user space, ta có thể gửi tính hiệu từ kernel space (soft interrupt) thông qua cơ chế SIGNAL (sẽ được đề cập sau) Việc sử dụng các GPIO như các nguồn ngắt ngoài tạo nên sự linh hoạt và tiện lợi cho các hệ thống vận hành với Linux OS
Chương trình sau (gpio_irq.c) minh họa cách khai báo và sử dụng pin
"AT91_PIN_PB16" (pin 5 trên Externtion J17), khi có xung cạnh lên hoặc cạnh xuống thì chương trình phục vụ ngắt được gọi và in ra thông báo "gpio isr handler in irq XX".Sau đây là source của chương trình:
Trang 21[size=2] int ret;[/size]
[size=2] [/size]
[size=2] ret = gpio_request (PIN, "IRQ"); /* GPIO request*/[/size]
[size=2] [/size]
[size=2] if (ret) {[/size]
[size=2] printk (KERN_ALERT "Unable to request PC6\n");[/size]
[size=2] }[/size]
[size=2] [/size]
[size=2] at91_set_GPIO_periph (PIN, 1); // PIN as GPIO and Pull Up[/size][size=2] at91_set_gpio_input (PIN, 1); // PIN as input and Pull Up[/size][size=2] at91_set_deglitch (PIN, 1); // PIN deglitch[/size]
[size=2] ret = request_irq (irq, gpio_irq_handler,[/size]
[size=2] IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,[/size][size=2] "MyIRQ", NULL);[/size]
[size=2] [/size]
[size=2] if (ret) {[/size]
[size=2] printk (KERN_ALERT "IRQ %d is not free\n", irq);[/size]
[size=2] return ret;[/size]
Trang 22[size=2] printk (KERN_ALERT "exit gpio_irq module\n");[/size]
[size=2] free_irq (irq, NULL);[/size]
[size=2] gpio_free (PIN);[/size]
[size=2]MODULE_DESCRIPTION("gpio irq example");[/size]
Makefile như sau:
Trang 23gpio isr handler in irq 80
gpio isr handler in irq 80
[size=3][font=Times New Roman]gpio isr handler in irq 80[/font][/size]
T.Năm 17 Tháng 12, 2009 9:31 pm
SIGNAL:
Signal là cơ chế báo hiệu từ kernel đế process hoặc từ process to process, đây là cơ chế được sử dụng phổ biến và hiệu quả Khi một chương trình đang chạy, ta có thể ngưng chương trình bằng cách ấn phím CTR-C Về bản chất, khi ta ấn phím này, Linux tạo ra signal có tên SIGINT(2), các process đón nhận signal này và thực hiện kết thúc process
Trang 24Hoặc ta có thể truyền signal từ proccess này sang process khác nếu ta biết được PID của process cần được gửi đến Ta có thể thực hiện trên shell:
$ kill -n signum PID
Trong đó signum là signal number cần gửi (được định nghĩa trong signal.h), và PID là process ID của process cần gửi signal tới Có thể xem danh sách signum của hệ thống theo lệnh sau:
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2