Lưu ý
Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.
- Bản gốc:
- Người dịch:
Google Translate (machine translation)
- Phiên bản gốc:
8541d8f725c6
Cảnh báo
Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.
Kernel CAPI Giao diện với trình điều khiển phần cứng¶
1. Tổng quan¶
Từ thông số kỹ thuật CAPI 2.0: COMMON-ISDN-API (CAPI) là chuẩn giao diện lập trình ứng dụng được sử dụng để truy cập thiết bị ISDN được kết nối với giao diện tốc độ cơ bản (BRI) và giao diện chính giao diện tốc độ (PRI).
Kernel CAPI hoạt động như một lớp điều phối giữa các ứng dụng CAPI và CAPI trình điều khiển phần cứng. Trình điều khiển phần cứng đăng ký thiết bị ISDN (bộ điều khiển, trong CAPI biệt ngữ) với Kernel CAPI để biểu thị mức độ sẵn sàng cung cấp dịch vụ của họ đến các ứng dụng CAPI. Các ứng dụng CAPI cũng đăng ký với Kernel CAPI, yêu cầu liên kết với thiết bị CAPI. Kernel CAPI sau đó gửi đăng ký ứng dụng vào một thiết bị có sẵn, chuyển tiếp nó tới trình điều khiển phần cứng tương ứng. Kernel CAPI sau đó chuyển tiếp tin nhắn CAPI ở cả hai hướng dẫn giữa ứng dụng và trình điều khiển phần cứng.
Định dạng và ngữ nghĩa của tin nhắn CAPI được chỉ định trong tiêu chuẩn CAPI 2.0. Tiêu chuẩn này được cung cấp miễn phí từ ZZ0000ZZ
2. Đăng ký trình điều khiển và thiết bị¶
Trình điều khiển CAPI phải đăng ký từng thiết bị ISDN mà họ điều khiển bằng Kernel
CAPI bằng cách gọi hàm Kernel CAPI Attach_capi_ctr() bằng một con trỏ tới một
struct capi_ctr trước khi chúng có thể được sử dụng. Cấu trúc này phải được lấp đầy bằng
tên của trình điều khiển và bộ điều khiển và một số chức năng gọi lại
các con trỏ sau đó được Kernel CAPI sử dụng để liên lạc với
người lái xe. Việc đăng ký có thể được thu hồi bằng cách gọi hàm
tách_capi_ctr() bằng một con trỏ tới cùng cấu trúc capi_ctr.
Trước khi có thể sử dụng thiết bị thực sự, người lái xe phải điền thông tin vào thiết bị
các trường thông tin ‘manu’, ‘version’, ‘profile’ và ‘serial’ trong capi_ctr
cấu trúc của thiết bị và báo hiệu sự sẵn sàng của thiết bị bằng cách gọi capi_ctr_ready().
Từ đó trở đi, Kernel CAPI có thể gọi các hàm gọi lại đã đăng ký cho
thiết bị.
Nếu thiết bị không thể sử dụng được vì bất kỳ lý do gì (tắt máy, ngắt kết nối ...),
trình điều khiển phải gọi capi_ctr_down(). Điều này sẽ ngăn chặn các cuộc gọi tiếp theo đến
chức năng gọi lại của Kernel CAPI.
3. Đăng ký và liên lạc ứng dụng¶
Kernel CAPI chuyển tiếp yêu cầu đăng ký từ các ứng dụng (gọi tới CAPI
hoạt động CAPI_REGISTER) tới trình điều khiển phần cứng thích hợp bằng cách gọi nó
hàm gọi lại register_appl(). ID ứng dụng duy nhất (ApplID, u16) là
được phân bổ bởi Kernel CAPI và chuyển tới register_appl() cùng với
cấu trúc tham số được cung cấp bởi ứng dụng. Điều này tương tự với
open() hoạt động trên các tập tin thông thường hoặc các thiết bị ký tự.
Sau khi trả về thành công từ register_appl(), các tin nhắn CAPI từ
ứng dụng có thể được chuyển tới trình điều khiển của thiết bị thông qua các cuộc gọi đến
hàm gọi lại send_message(). Ngược lại, trình điều khiển có thể gọi Kernel
Hàm capi_ctr_handle_message() của CAPI để chuyển tin nhắn CAPI đã nhận tới
Kernel CAPI để chuyển tiếp tới một ứng dụng, chỉ định ApplID của nó.
Yêu cầu hủy đăng ký (CAPI hoạt động CAPI_RELEASE) từ các ứng dụng được
được chuyển tiếp dưới dạng lệnh gọi đến hàm gọi lại Release_appl(), chuyển tiếp lệnh gọi tương tự
ApplID như với register_appl(). Sau khi trở về từ Release_appl(), không có CAPI
tin nhắn cho ứng dụng đó có thể được chuyển đến hoặc từ thiết bị nữa.
4. Cấu trúc dữ liệu¶
4.1 cấu trúc capi_driver¶
Cấu trúc này mô tả chính trình điều khiển Kernel CAPI. Nó được sử dụng trong
Các hàm register_capi_driver() và unregister_capi_driver() và chứa
các trường không riêng tư sau đây, tất cả đều do trình điều khiển đặt trước khi gọi
register_capi_driver():
- ZZ0000ZZ
tên của trình điều khiển, dưới dạng chuỗi ASCII kết thúc bằng 0
- ZZ0001ZZ
số sửa đổi của trình điều khiển, dưới dạng chuỗi ASCII kết thúc bằng 0
4.2 cấu trúc capi_ctr¶
Cấu trúc này mô tả một thiết bị ISDN (bộ điều khiển) được xử lý bởi Kernel CAPI
người lái xe. Sau khi đăng ký thông qua hàm Attach_capi_ctr(), nó sẽ được chuyển tới
tất cả các chức năng gọi lại và giao diện lớp dưới cụ thể của bộ điều khiển để
xác định bộ điều khiển để hoạt động.
Nó chứa các trường không riêng tư sau:
được trình điều khiển thiết lập trước khi gọi Attach_capi_ctr():¶
- ZZ0000ZZ
con trỏ tới mô-đun trình điều khiển sở hữu thiết bị
- ZZ0000ZZ
một con trỏ mờ tới dữ liệu cụ thể của trình điều khiển, không được Kernel CAPI chạm vào
- ZZ0000ZZ
tên của bộ điều khiển, dưới dạng chuỗi ASCII kết thúc bằng 0
- ZZ0000ZZ
tên của trình điều khiển, dưới dạng chuỗi ASCII kết thúc bằng 0
- ZZ0000ZZ
(tùy chọn) con trỏ tới chức năng gọi lại để gửi chương trình cơ sở và dữ liệu cấu hình cho thiết bị
Chức năng có thể quay trở lại trước khi thao tác hoàn tất.
Việc hoàn thành phải được báo hiệu bằng lệnh gọi tới capi_ctr_ready().
- Giá trị trả về: 0 nếu thành công, mã lỗi nếu có lỗi
Được gọi trong bối cảnh quá trình.
- ZZ0000ZZ
(tùy chọn) con trỏ tới chức năng gọi lại để dừng thiết bị, phát hành tất cả các ứng dụng đã đăng ký
Chức năng có thể quay trở lại trước khi thao tác hoàn tất.
Việc hoàn thành phải được báo hiệu bằng lệnh gọi tới capi_ctr_down().
Được gọi trong bối cảnh quá trình.
- ZZ0000ZZ
con trỏ tới hàm gọi lại để đăng ký ứng dụng với thiết bị
- Các cuộc gọi đến các chức năng này được Kernel CAPI tuần tự hóa để chỉ
một cuộc gọi đến bất kỳ ai trong số họ sẽ được kích hoạt bất cứ lúc nào.
- ZZ0000ZZ
con trỏ tới chức năng gọi lại hủy đăng ký ứng dụng với thiết bị
- Các cuộc gọi đến các chức năng này được Kernel CAPI tuần tự hóa để chỉ
một cuộc gọi đến bất kỳ ai trong số họ sẽ được kích hoạt bất cứ lúc nào.
- ZZ0000ZZ
con trỏ tới hàm gọi lại để gửi tin nhắn CAPI tới thiết bị
Giá trị trả về: Mã lỗi CAPI
- Nếu phương thức trả về 0 (CAPI_NOERROR), trình điều khiển đã có quyền sở hữu
của skb và người gọi có thể không truy cập được nữa. Nếu nó trả về một giá trị khác 0 (lỗi) thì quyền sở hữu skb sẽ trả về cho người gọi người có thể tái sử dụng hoặc giải phóng nó.
- Giá trị trả về chỉ nên được sử dụng để báo hiệu các vấn đề liên quan đến
để chấp nhận hoặc xếp hàng tin nhắn. Các lỗi xảy ra trong quá trình Quá trình xử lý thực tế của tin nhắn phải được báo hiệu bằng một tin nhắn trả lời thích hợp.
Có thể được gọi trong quá trình hoặc bối cảnh gián đoạn.
- Các cuộc gọi đến chức năng này không được Kernel CAPI tuần tự hóa, tức là. nó phải
chuẩn bị nhập lại.
- ZZ0000ZZ
con trỏ tới hàm gọi lại trả về mục nhập cho thiết bị trong bảng thông tin bộ điều khiển CAPI, /proc/capi/controller
- Lưu ý:
Các hàm gọi lại ngoại trừ
send_message()không bao giờ được gọi khi bị gián đoạn bối cảnh.
cần điền trước khi gọi capi_ctr_ready():¶
- ZZ0000ZZ
giá trị trả về cho CAPI_GET_MANUFACTURER
- ZZ0000ZZ
giá trị trả về cho CAPI_GET_VERSION
- ZZ0000ZZ
giá trị trả về cho CAPI_GET_PROFILE
- ZZ0000ZZ
giá trị trả về cho CAPI_GET_SERIAL
4.3 SKB¶
Tin nhắn CAPI được chuyển giữa Kernel CAPI và trình điều khiển thông qua send_message()
và capi_ctr_handle_message(), được lưu trữ trong phần dữ liệu của bộ đệm ổ cắm
(skb). Mỗi skb chứa một thông báo CAPI được mã hóa theo CAPI 2.0
tiêu chuẩn.
Đối với các tin nhắn truyền dữ liệu, DATA_B3_REQ và DATA_B3_IND, giá trị thực tế dữ liệu tải trọng ngay lập tức theo sau thông báo CAPI trong cùng một skb. Các tham số Data và Data64 không được sử dụng để xử lý. Dữ liệu64 tham số có thể được bỏ qua bằng cách đặt trường độ dài của thông báo CAPI thành 22 thay vì 30.
4.4 Cấu trúc _cmsg¶
(được khai báo trong <linux/isdn/capiutil.h>)
Cấu trúc _cmsg lưu trữ nội dung của tin nhắn CAPI 2.0 một cách dễ dàng hình thức có thể truy cập được. Nó chứa các thành viên cho tất cả các tham số CAPI 2.0 có thể có, bao gồm các thông số phụ của Thông tin bổ sung và Giao thức B có cấu trúc tham số, với các ngoại lệ sau:
Số bên gọi thứ hai (CONNECT_IND)
Dữ liệu64 (DATA_B3_REQ và DATA_B3_IND)
Gửi hoàn tất (tham số phụ của Thông tin bổ sung, CONNECT_REQ và INFO_REQ)
Cấu hình toàn cầu (tham số phụ của Giao thức B, CONNECT_REQ, CONNECT_RESP và SELECT_B_PROTOCOL_REQ)
Chỉ những tham số xuất hiện trong loại thông báo hiện đang được xử lý thực sự được sử dụng. Các thành viên không sử dụng nên được đặt thành 0.
Các thành viên được đặt tên theo tên tiêu chuẩn CAPI 2.0 của các thông số mà họ đại diện. Xem <linux/isdn/capiutil.h> để biết cách viết chính xác. Dữ liệu thành viên các loại là:
5. Chức năng giao diện lớp dưới¶
đăng ký/hủy đăng ký thiết bị (bộ điều khiển) với Kernel CAPI
Bộ điều khiển tín hiệu sẵn sàng/chưa sẵn sàng
- void capi_ctr_handle_message(struct capi_ctr * ctrlr, ứng dụng u16,
cấu trúc sk_buff *skb)
chuyển tin nhắn CAPI đã nhận tới Kernel CAPI để chuyển tiếp đến ứng dụng được chỉ định
6. Chức năng trợ giúp và macro¶
Macro để trích xuất/đặt các giá trị phần tử từ/trong tiêu đề thư CAPI (từ <linux/isdn/capiutil.h>):
Lấy phần tử Macro Set Macro (Loại)¶
CAPIMSG_LEN(m) CAPIMSG_SETLEN(m, len) Tổng chiều dài (u16) CAPIMSG_APPID(m) CAPIMSG_SETAPPID(m, ứng dụng) ID ứng dụng (u16) Lệnh CAPIMSG_COMMAND(m) CAPIMSG_SETCOMMAND(m,cmd) (u8) CAPIMSG_SUBCOMMAND(m) CAPIMSG_SETSUBCOMMAND(m, cmd) Lệnh phụ (u8) CAPIMSG_CMD(m) - Lệnh*256
Lệnh phụ (u16)
CAPIMSG_MSGID(m) CAPIMSG_SETMSGID(m, msgid) Số tin nhắn (u16)
- Bộ điều khiển CAPIMSG_CONTROL(m) CAPIMSG_SETCONTROL(m, contr)/PLCI/NCCI
(u32)
CAPIMSG_DATALEN(m) CAPIMSG_SETDATALEN(m, len) Độ dài dữ liệu (u16)¶
Các hàm thư viện để làm việc với cấu trúc _cmsg (từ <linux/isdn/capiutil.h>):
- ZZ0000ZZ
Trả về tên thông báo CAPI 2.0 tương ứng với lệnh đã cho và các giá trị lệnh phụ, dưới dạng chuỗi ASCII tĩnh. Giá trị trả về có thể là NULL nếu lệnh/lệnh phụ không phải là một trong những lệnh được xác định trong Tiêu chuẩn CAPI 2.0.
7. Gỡ lỗi¶
Mô-đun kernelcapi có tham số mô-đun showcapimsgs kiểm soát một số đầu ra gỡ lỗi được tạo ra bởi mô-đun. Nó chỉ có thể được thiết lập khi mô-đun được được tải, thông qua tham số “showcapimsgs=<n>” cho lệnh modprobe, hoặc trên dòng lệnh hoặc trong tập tin cấu hình.
Nếu bit thấp nhất của showcapimsgs được đặt, bộ điều khiển nhật ký kernelcapi và sự kiện lên xuống của ứng dụng.
Ngoài ra, mọi bộ điều khiển CAPI đã đăng ký đều có dấu vết liên quan tham số kiểm soát cách các tin nhắn CAPI được gửi từ và đến bộ điều khiển đã đăng nhập. Tham số traceflag được khởi tạo với giá trị của tham số showcapimsgs khi bộ điều khiển được đăng ký, nhưng sau này có thể được đã thay đổi thông qua lệnh MANUFACTURER_REQ KCAPI_CMD_TRACE.
Nếu giá trị của traceflag khác 0, các thông báo CAPI sẽ được ghi lại. Tin nhắn DATA_B3 chỉ được ghi lại nếu giá trị của traceflag > 2.
Nếu bit thấp nhất của traceflag được đặt thì chỉ có lệnh/lệnh phụ và thông báo chiều dài được ghi lại. Mặt khác, kernelcapi ghi lại một biểu diễn có thể đọc được của toàn bộ tin nhắn.