Professional Documents
Culture Documents
Một resource Manager là một user-level mức người dùng cung cấp những chương trình có thể truy
xuất những thông điệp đến những chương trình khác hay giao tiếp với phần cứng. Nó là một quy
trình ghi nhận đường dẫn ví dụ /dev/ser1 sử dụng các tập lệnh cơ bản open(), read(), write().
Ví dụ:
fd = open("/dev/ser1", O_RDWR);
for (packet = 0; packet < npackets; packet++)
write(fd, packets[packet], PACKET_SIZE);
close(fd);
open(), open64()
Mỡ một file
Cấu trúc:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
Embedded Group 1
Kobekara Company 2008
read()
Đọc bytes từ một file
Cấu trúc:
#include <unistd.h>
ví dụ
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
Ví dụ
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
Embedded Group 2
Kobekara Company 2008
ioctl()
Điều khiển một thiết bị
Cấu trúc:
#include <sys/ioctl.h>
int ioctl( int fd,
int request,
... );
Embedded Group 3
Kobekara Company 2008
resmgr layer
dispatch layer
Chứa tập hợp hàm của file hệ thống. IOFUNC cung cấp POSIX-personality.
Embedded Group 4
Kobekara Company 2008
Cho phép tạo Resource manager đơn luồng hây đa luồng. Nghĩa là một luồng đang sử lí lệnh
write(), luồng khác sử lí lệnh read() đồng thời với nhau.
Ví dụ:
Single-threaded device resource manager
Here's an outline of the steps we followed:
Embedded Group 5
Kobekara Company 2008
Embedded Group 6
Kobekara Company 2008
PCI trong khoa học máy tính (là viết tắt Tiếng Anh: Peripheral Component Interconnect) là một
chuẩn để truyền dữ liệu giữa các thiết bị ngoại vi đến một bo mạch chủ (thông qua chip cầu nam).
Embedded Group 7
Kobekara Company 2008
Khi giao tiếp với các thiết bị ngoại vi đòi hỏi phải có cơ chế truyền và nhận dữ liệu giữa các thiết bị
đó. Kiến trúc PCI được thiết kế như là một sự thay thế chuẩn ISA nhằm truyền tải dữ liệu giữa máy
tính và các thiết bị ngoại vi tốt hơn. PCI được trang bị 32 bit dữ liệu và 64 bit mỡ rộng, xây dựng
trên Platform độc lập. Khi cài đặt Driver cho PCI, nó sẽ dò giao diện bo mạch và cấu hình tự động
khi khởi động máy, từ đó người dùng có thể truy xuất thông tin cấu hình thiết bị.
2. PCI Architecture
Speed: Có thể truyền tốc độ 133MBytes với 32bit hoặc 266 MBytes/s với 64 bit.
Configurability: hệ thống bus độc lập với processor cho phép định cấu hình tự động dễ dàng
cho người sử dụng.
Multiple Master: bất kỳ thiết bị nào cũng có thể là chủ bus hỗ trợ cơ chế DMA
Reliability: có tính Hot plug và Hot swap: khả năng thay đổi module mà không làm ảnh
hưởng tới hoạt động của hệ điều hành.
Embedded Group 8
Kobekara Company 2008
Embedded Group 9
Kobekara Company 2008
Khi có nhiều thiết bị cùng yêu cầu làm chủ bus, việc xử lý bus dựa vào bộ Arbiter
REQ: tín hiệu yêu cầu làm chủ bus
GNT: tín hiệu cấp bus
Embedded Group 10
Kobekara Company 2008
Exam:PCI 9050
Embedded Group 11
Kobekara Company 2008
Embedded Group 12
Kobekara Company 2008
Các lệnh cơ bản giao tiếp với PCI trong hệ điều hành QNX và các thiết bị ngoại vi:
3.1 pci_attach()
3.2 pci_attach_device()
Embedded Group 13
Kobekara Company 2008
uint16_t idx,
struct pci_dev_info* info );
handle: xác nhận thiết bị. Gọi lần đầu chức năng này, thiết lập Handle là NULL. Chức năng này trả
lại một Handle để có thể sử dụng vào lần kế tiếp.
Idx: là Index của thiết bị, số 0 cho thiết bị đầu tiên, số 1 cho thiết bị kế .v.v.
Info: trỏ đến cấu trúc pci_dev_info structure để chỉ rõ mã code, vendor/device ID, hay số bus và số
device/function muốn scan.
3.4 pci_detach()
3.5 pci_detach_device()
3.6 pci_find_class()
Embedded Group 14
Kobekara Company 2008
dev_func: số device hay funtion thứ cấp của lớp đã cho. Số device là 7 đến 3 bit, còn số funtion là 2
đến 0.
Hàm pci_find_class() xác định vị trí của PCI hay funtion thứ n có mã code xác định.
3.7 pci_find_device()
3.8 pci_present()
3.9 Notes
Embedded Group 15
Kobekara Company 2008
Exam:
int main (int argc, char **argv)
{
int pathID;
int unit_num;
int ret;
char name[20];
unit_num = atoi(argv[1]);
// if ( isdigit ( (int)argv[1] ) ) unit_num = atoi(argv[1]);
// else unit_num = 0;
// if (unit_num < 0 || unit_num > 9) unit_num = 0;
Embedded Group 16
Kobekara Company 2008
etsPO2GetDevInfo(&po2dev, po2PciConfInfo);
strcpy(name, "/dev/ets_po2_");
strcat(name,argv[1]);
if (pathID == -1)
{
fprintf (stderr, "%s: couldn't attach pathname: %s\n",progname, strerror (errno));
exit (EXIT_FAILURE);
}
while (1)
{
if ((ctp = dispatch_block (ctp)) == NULL)
{
fprintf (stderr, "%s: dispatch_block failed: %s\n", progname, strerror (errno));
exit (EXIT_FAILURE);
}
dispatch_handler (ctp);
}
}
Code:
#include <sys/neutrino.h>
#include <hw/pci.h>
#include <hw/pci_devices.h>
#include <stdio.h>
#include <sys/mman.h>
#include <errno.h>
Embedded Group 17
Kobekara Company 2008
void*mem_hndl;
uint32_t addr_hndl;
void pci_debug(struct pci_dev_info *inf);
void pci_give_command(uint16_t pci_command, struct pci_dev_info *inf);
int hdlc_detect_card(void);
void remove_card(struct pci_dev_info *inf);
}
void pci_debug(struct pci_dev_info *inf)
{
uint32_t i;
fprintf(stdout,"\n device id=%x",inf->DeviceId);
fprintf(stdout,"\n Vendo id=%x",inf->VendorId);
fprintf(stdout,"\n BusNumber=%x",inf->BusNumber);
fprintf(stdout,"\n device function=%x",inf->DevFunc);
fprintf(stdout,"\n device class=%x",inf->Class);
fprintf(stdout,"\n device irq=%x",inf->Irq);
fprintf(stdout,"\n pcibase address =%x",(*(inf->CpuBaseAddress)));
//addr_hndl=(uint32_t*)(*(inf->CpuBaseAddress));
fprintf(stdout,"\n base address size=%x",(*(inf->BaseAddressSize)));
pci_read_config32(inf->BusNumber,inf->DevFunc,0x10,1,&i);
fprintf(stdout,"\n base address 0=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x14,1,&i);
fprintf(stdout,"\n base address 1=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x18,1,&i);
fprintf(stdout,"\n base address 2=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x1c,1,&i);
fprintf(stdout,"\n base address 3=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x20,1,&i);
fprintf(stdout,"\n base address 4=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x24,1,&i);
fprintf(stdout,"\n base address 5=%x",i);
Embedded Group 18
Kobekara Company 2008
}
int hdlc_detect_card(void)
{
volatile uint32_t *x;
volatile int status;
volatile int pidx=0;
int flg;
unsigned device=HOTICE_CARD_DEVICE_ID;
unsigned vendor=HOTICE_CARD_VENDOR_ID;
unsigned index=1;
unsigned bus;
unsigned dev;
unsigned func;
unsigned dev_func;
hndl=pci_attach_device(NULL,(PCI_SHARE|PCI_SEARCH_VENDEV|PCI_INIT_ALL),pidx,&i
nf);
// hndl = pci_attach_device( NULL, (PCI_SEARCH_VENDEV|PCI_INIT_ALL), pidx, &inf );
if(NULL==hndl)
{
fprintf(stderr,"\n Erro code %x, implies %s",errno,sys_errlist[errno]);
Embedded Group 19
Kobekara Company 2008
return errno;
}
//pci_debug(&inf);
status =pci_read_config32(inf.BusNumber,inf.DevFunc,0x10,1,&addr);
if (PCI_SUCCESS!=status)
{
fprintf(stderr,"\n error reading config space 0 BAR2");
}
else
{
fprintf(stdout,"\n reading config space 0 BAR2, addr is =%x",addr);
addr_hndl=PCI_MEM_ADDR(addr);
fprintf(stdout,"\n config space 0 BAR2 addr is =%x",addr_hndl);
// flg=(/*MAP_PRIVATE|*/MAP_ANON|MAP_PHYS);
flg=0;
#if 0
mem_hndl=mmap(/*FUNC0_BAR_START*/NULL,(*(inf.BaseAddressSize)),(PROT_READ|PR
OT_WRITE/*|PROT_NOCACHE*/),flg,NOFD,(uint64_t)addr_hndl);
#endif
#if 1
mem_hndl=mmap_device_memory(/*FUNC0_BAR_START*/NULL,(*(inf.BaseAddressSize)),(P
ROT_READ|PROT_WRITE/*|PROT_NOCACHE*/),flg,(uint64_t)addr_hndl);
#endif
// |MAP_BELOW16M
if (MAP_FAILED==mem_hndl)
{
fprintf(stderr, "mmap failed : %s\n",strerror(errno));
remove_card(&inf);
return;
}
fprintf(stdout,"\n config space 0 BAR2 map addr is =%x",mem_hndl);
pci_give_command(0x384, &inf);
x=(uint32_t*)(mem_hndl+0x0600);
*x=0x00000010;
fprintf(stdout,"\n 1.base read addr =%x",x);
fprintf(stdout,"\n 1.value at base read addr =%x",*x);
x=(uint32_t*)(mem_hndl+0x0008);
// x=(uint32_t*)addr_hndl;
*x=0x00000100;
fprintf(stdout,"\n 2. base read addr =%x",x);
fprintf(stdout,"\n 2.value at base read addr =%x",*x);
x=(uint32_t*)(mem_hndl+0x0600);
// *x=0x00000010;
fprintf(stdout,"\n 3.base read addr =%x",x);
fprintf(stdout,"\n 3.value at base read addr =%x",*x);
x=(uint32_t*)(mem_hndl+0x0008);
Embedded Group 20
Kobekara Company 2008
// x=(uint32_t*)addr_hndl;
*x=0x00000000;
fprintf(stdout,"\n 4.base read addr =%x",x);
fprintf(stdout,"\n 4.value at base read addr =%x",*x);
/*Interrupt Status Descriptor*/
x=(uint32_t*)(mem_hndl+0x000C);
while (*x==0x00)
{
fprintf(stdout,"\n 5.base read addr =%x",x);
fprintf(stdout,"\n 5.value at base read addr =%x",*x);
}
}
}
}
Embedded Group 21
Kobekara Company 2008
Chuẩn IEEE 1394 được biết như là Fire-Wire™ và i.LINK™, là chuẩn truyền tải kỹ dữ liệu số nối
tiếp. Tổ chức IEEE xây dựng chuẩn này từ năm 1994 với mục đích thiết lập một tiêu chuẩn truyền
tải dữ liệu với băng thông rộng và tốc độ cao khi kết nối với các thiết bị ngoại vi. Tốc độ truyền tải
từ 100 Mbip/s lên đến 3200 Mbip/s, hỗ trợ chế độ hot-plug. Hình vẽ là bảng so sánh giữa chuẩn
IEEE 1394 và chuẩn USB.
Driver của một thiết bị kết nối với bus IEEE 1394 đặt ở phần đầu của IEEE 1394 driver stack.
Driver này giao tiếp với thiết bị bằng cách gởi IRPs đến bus driver IEEE. Nó cung cấp một một
giao diện phần cứng độc lập với bus IEEE 1394.
Embedded Group 22
Kobekara Company 2008
Embedded Group 23
Kobekara Company 2008
Embedded Group 24
Kobekara Company 2008
PART 4: C PROGRAMMING
1. Overview C Programming
1.1 Foundation of C
Table of Contents
PART 1: WRITING A RESOURCE MANAGER .............................................................................. 1
1. Overview QNX ............................................................................................................................ 1
2. Writing a resource manager ......................................................................................................... 1
2.1 Commands basic ................................................................................................................... 1
2.2 Components of a resource manager ...................................................................................... 3
2.2.1 iofunc layer .................................................................................................................... 3
2.2.2 resmgr layer ................................................................................................................... 4
2.2.3 dispatch layer ................................................................................................................. 4
2.2.4 thread pool layer ............................................................................................................ 4
PART 2: PCI ARCHITECTURE ......................................................................................................... 7
1. OVERVIEW PCI ......................................................................................................................... 7
2. PCI Architecture .......................................................................................................................... 8
2.1 Advantage of PCI .................................................................................................................. 8
2.2 Characteristics basic .............................................................................................................. 8
Embedded Group 25
Kobekara Company 2008
Embedded Group 26