今天嘗試自動動手寫usb裝置驅動程式。本想自己寫乙個u盤的驅動程式,實現簡單的掛載。但塊裝置讀寫還不是弄得很透徹,只能照著教程實現簡單的usb滑鼠驅動程式。
usb hid裝置驅動程式,在系統裡是自帶的。需要去掉 config_usb_hidx選項,但是config_hid_generic需要選中,否則,註冊usb驅動之後,不能識別hid裝置,就跳轉不到probe成員中。
首先,需要申明usb_device_id,系統就是根據這個id號來匹配裝置,進而呼叫驅動的。
static struct usb_device_id usb_mouse_pen_id_table = ,
//,{}
};
這裡可以用滑鼠的介面描述符來宣告,實際測試,如果你知道裝置的pid,vid,用pid,vid的方式宣告也是可以的,這樣驅動就只適合特定的裝置了。用lsusb檢視,得到裝置的pid,vid號為0x046d,0xc534。但我的usb receiver是連線滑鼠和鍵盤的。這會導致兩次進入.probe函式,需要分別處理鍵盤和滑鼠裝置。這裡,簡單起見,我就只識別了滑鼠。
usb driver的宣告
static struct usb_driver usb_pen_driver = ;
init函式中,只需要usb_register(&usb_pen_driver);就可以了。
在probe中,申請,註冊乙個input_device
/*申請設定乙個inputdevice*/
up_dev = input_allocate_device();
/*setting*/
set_bit(ev_syn, up_dev->evbit);
set_bit(ev_abs, up_dev->evbit);
set_bit(ev_key, up_dev->evbit);
set_bit(btn_touch, up_dev->keybit);
set_bit(abs_x, up_dev->absbit);
set_bit(abs_y, up_dev->absbit);
set_bit(abs_pressure, up_dev->absbit);
set_bit(btn_touch, up_dev->keybit);
input_set_abs_params(up_dev, abs_x, 0, 800, 0, 0);
input_set_abs_params(up_dev, abs_y, 0, 480, 0, 0);
input_set_abs_params(up_dev, abs_pressure, 0, 1, 0 , 0);
input_register_device(up_dev);
分配,設定,最後提交urb
pipe = usb_rcvintpipe(dev, endpoint->bendpointaddress);
len = endpoint->wmaxpacketsize;
usb_buf = usb_alloc_coherent(dev, len, gfp_atomic, &usb_buf_phys);
up_urb = usb_alloc_urb(0,gfp_kernel);
usb_fill_int_urb(up_urb,dev,pipe,usb_buf,len,usb_pen_irq,null,endpoint->binterval);
up_urb->transfer_dma = usb_buf_phys;
up_urb->transfer_flags |= urb_no_transfer_dma_map;
//up_urb->hcpriv = "just_as_a_flag";
usb_submit_urb(up_urb,gfp_kernel);
中斷函式中,需要解析usb滑鼠傳過來的資料。第二個byte表示各個按鍵的標誌位。第三個byte和第四個byte是x軸和y軸的相對位移。這裡,滑鼠的反應是很靈敏的,可以在這裡除以乙個引數。這裡,我的設計是,監測到位移後,x,y的座標值做相應改變。滑鼠左鍵按下後,提交絕對位置。
static void usb_pen_irq(struct urb *urb)
else
if ((ms_data[3]!=0)||(ms_data[4]!=0))
else
}else
else
}if (ms_data[4]>0)
else
}else
else
}//usb_print("move x[%d], y[%d]\n",up_location.x ,up_location.y);
//usb_print("move d0[%d], d1[%d],d2[%d],d3[%d],d4[%d],d5[%d]\n",ms_data[0],ms_data[1],ms_data[2],ms_data[3],ms_data[4],ms_data[5]);
}usb_submit_urb(urb, gfp_kernel);
return;
}
編譯,insmod之後,插上滑鼠,就能在/dev/input下看到新增加的event*裝置。
按照tslib的配置流程,設定tslib_tsdevice為新增加的event,執行ts_test就可以用滑鼠當畫筆。不過ts_calibrate校準的過程,需要根據觸控螢幕大小,計算幾個校準點的位置,然後根據列印出來的資料來校準。以後碰到usb裝置的驅動程式,也有章可循
在開發板上掛載NFS
在開發板上掛載nfs 網路檔案系統 nfs,network file system 是一種將遠端主機上的分割槽 目錄 經網路掛載到本地系統的一種機制,通過對網路檔案系統的支援,使用者可以在本地系統上像操作本地分割槽一樣來對遠端主機的共享分割槽 目錄 進行操作。嵌入式linux 的nfs 開發環境的實...
在開發板上增加中文環境
拷貝工具鏈裡的i18n目錄到 usr share下 在 usr lib 下建立乙個locale目錄,執行 localedef f utf 8 i zh cn zh cn.utf8命令。就能在 usr lib locale下建立乙個locale archive檔案。用locale a命令就能看到剛才加...
開發板 2440開發板
開發板 2440 開發板coall2440 開發板 高效能 samsung s3c2440a 處理器開發板 小區智慧型開發板 樓宇對講開發板 三星 2440 開發板 珠三角電子開發 小型終端開發板 手持裝置開發方案 編譯碼 2440 開發板 深圳 2440 開發板 單片板 硬體主機板 硬體底板 jt...