0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

linux內(nèi)核中通用HID觸摸驅(qū)動(dòng)

嵌入式小生 ? 來源:嵌入式小生 ? 2024-10-29 10:55 ? 次閱讀

一、內(nèi)核中通用hid觸摸驅(qū)動(dòng)

linux內(nèi)核中,為HID觸摸面板實(shí)現(xiàn)了一個(gè)通用的驅(qū)動(dòng)程序,位于/drivers/hid/hid-multitouch.c文件中。hid觸摸驅(qū)動(dòng)是以struct hid_driver實(shí)現(xiàn),首先定義一個(gè)描述hid觸摸驅(qū)動(dòng)的結(jié)構(gòu)mt_driver:

staticstructhid_drivermt_driver={
.name="hid-multitouch",
.id_table=mt_devices,
.probe=mt_probe,
.remove=mt_remove,
.input_mapping=mt_input_mapping,
.input_mapped=mt_input_mapped,
.input_configured=mt_input_configured,
.feature_mapping=mt_feature_mapping,
.usage_table=mt_grabbed_usages,
.event=mt_event,
.report=mt_report,
.suspend=pm_ptr(mt_suspend),
.reset_resume=pm_ptr(mt_reset_resume),
.resume=pm_ptr(mt_resume),
};

并實(shí)現(xiàn)了struct hid_driver結(jié)構(gòu)中關(guān)鍵的函數(shù)。接著使用module_hdi_driver()將該驅(qū)動(dòng)以模塊方式構(gòu)建:

module_hid_driver(mt_driver);

mt_devices是一個(gè)truct hid_device_id類型的數(shù)組,定義了hid備的設(shè)備參數(shù),這些參數(shù)根據(jù)不同的廠家進(jìn)行劃分,劃分的準(zhǔn)則符合USB-HID協(xié)議,例如(

staticconststructhid_device_idmt_devices[]={

/*3Mpanels*/
{.driver_data=MT_CLS_3M,
MT_USB_DEVICE(USB_VENDOR_ID_3M,
USB_DEVICE_ID_3M1968)},
{.driver_data=MT_CLS_3M,
MT_USB_DEVICE(USB_VENDOR_ID_3M,
USB_DEVICE_ID_3M2256)},
{.driver_data=MT_CLS_3M,
MT_USB_DEVICE(USB_VENDOR_ID_3M,
USB_DEVICE_ID_3M3266)},

/*Antondevices*/
{.driver_data=MT_CLS_EXPORT_ALL_INPUTS,
MT_USB_DEVICE(USB_VENDOR_ID_ANTON,
USB_DEVICE_ID_ANTON_TOUCH_PAD)},

/*AsusT101HA*/
{.driver_data=MT_CLS_WIN_8_DISABLE_WAKEUP,
HID_DEVICE(BUS_USB,HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_ASUSTEK,
USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD)},
/*省略大量內(nèi)容*/

}

上述元素實(shí)則是填充struct hid_device_id的各個(gè)元素,HID_DEVICE宏包裝對(duì).bus、.group、.vendor、.product賦值操作:

4ed84076-90d2-11ef-a511-92fbcf53809c.png

在mt_devices數(shù)組中,直接使用HID_DEVICE以及衍生宏為其各個(gè)字段賦值。

二、probe過程剖析

從struct hid_driver mt_driver可以知道m(xù)t_drvier的.probe為mt_probe():

staticintmt_probe(structhid_device*hdev,conststructhid_device_id*id)
{
intret,i;
structmt_device*td;
conststructmt_class*mtclass=mt_classes;/*MT_CLS_DEFAULT*/

for(i=0;mt_classes[i].name;i++){
if(id->driver_data==mt_classes[i].name){
mtclass=&(mt_classes[i]);
break;
}
}

td=devm_kzalloc(&hdev->dev,sizeof(structmt_device),GFP_KERNEL);
if(!td){
dev_err(&hdev->dev,"cannotallocatemultitouchdata
");
return-ENOMEM;
}
td->hdev=hdev;
td->mtclass=*mtclass;
td->inputmode_value=MT_INPUTMODE_TOUCHSCREEN;
hid_set_drvdata(hdev,td);

INIT_LIST_HEAD(&td->applications);
INIT_LIST_HEAD(&td->reports);

if(id->vendor==HID_ANY_ID&&id->product==HID_ANY_ID)
td->serial_maybe=true;


/*OrientationisinvertediftheXorYaxesare
*flipped,butnormalizedifbothareinverted.
*/
if(hdev->quirks&(HID_QUIRK_X_INVERT|HID_QUIRK_Y_INVERT)&&
!((hdev->quirks&HID_QUIRK_X_INVERT)
&&(hdev->quirks&HID_QUIRK_Y_INVERT)))
td->mtclass.quirks=MT_QUIRK_ORIENTATION_INVERT;

/*Thisallowsthedrivertocorrectlysupportdevices
*thatemiteventsoverseveralHIDmessages.
*/
hdev->quirks|=HID_QUIRK_NO_INPUT_SYNC;

/*
*Thisallowsthedrivertohandledifferentinputsensors
*thatemitseventsthroughdifferentapplicationsonthesameHID
*device.
*/
hdev->quirks|=HID_QUIRK_INPUT_PER_APP;

if(id->group!=HID_GROUP_MULTITOUCH_WIN_8)
hdev->quirks|=HID_QUIRK_MULTI_INPUT;

if(mtclass->quirks&MT_QUIRK_FORCE_MULTI_INPUT){
hdev->quirks&=~HID_QUIRK_INPUT_PER_APP;
hdev->quirks|=HID_QUIRK_MULTI_INPUT;
}

timer_setup(&td->release_timer,mt_expired_timeout,0);

ret=hid_parse(hdev);
if(ret!=0)
returnret;

if(mtclass->quirks&MT_QUIRK_FIX_CONST_CONTACT_ID)
mt_fix_const_fields(hdev,HID_DG_CONTACTID);

ret=hid_hw_start(hdev,HID_CONNECT_DEFAULT);
if(ret)
returnret;

ret=sysfs_create_group(&hdev->dev.kobj,&mt_attribute_group);
if(ret)
dev_warn(&hdev->dev,"Cannotallocatesysfsgroupfor%s
",
hdev->name);

mt_set_modes(hdev,HID_LATENCY_NORMAL,true,true);

return0;
}

1、首先定義了一個(gè)結(jié)構(gòu)體指針 td,用于存儲(chǔ)多點(diǎn)觸摸設(shè)備的數(shù)據(jù)。

2、使用 devm_kzalloc 分配一個(gè) mt_device 結(jié)構(gòu)體大小的內(nèi)存,并初始化相關(guān)字段。如果內(nèi)存分配失敗,則返回錯(cuò)誤碼 -ENOMEM。

3、調(diào)用hid_set_drvdata()設(shè)置多點(diǎn)觸摸設(shè)備的數(shù)據(jù)指針,以便后續(xù)可以在其他函數(shù)中訪問到該設(shè)備的數(shù)據(jù)。

4、初始化設(shè)備數(shù)據(jù)結(jié)構(gòu)中的鏈表頭,用于管理多點(diǎn)觸摸應(yīng)用程序和報(bào)告。

5、根據(jù)設(shè)備的特性和屬性設(shè)置一些HID屬性。例如:根據(jù)設(shè)備的 ID 和 HID 類別設(shè)置了一些特殊的屬性和標(biāo)志。

6、使用 timer_setup 函數(shù)初始化了一個(gè)定時(shí)器,用于處理觸摸設(shè)備的釋放操作。

7、調(diào)用 hid_parse() 函數(shù)解析設(shè)備的報(bào)告描述符,并進(jìn)行相應(yīng)的初始化。

8、 如果設(shè)備具有特定的修復(fù)需求,例如修復(fù)常量接觸 ID 的問題,則調(diào)用 mt_fix_const_fields() 函數(shù)進(jìn)行修復(fù)。

9、調(diào)用hid_hw_start()函數(shù)啟動(dòng)設(shè)備的硬件,并指定默認(rèn)連接模式。

10、調(diào)用sysfs_create_group()函數(shù)創(chuàng)建sysfs組,以便在sysfs中創(chuàng)建設(shè)備屬性。

11、調(diào)用mt_set_modes()函數(shù)設(shè)置設(shè)備的模式,包括延遲模式和輸入模式。

12、如果一切順利,返回 0 表示成功,否則返回相應(yīng)的錯(cuò)誤碼。

總而言之,mt_probe()是一個(gè)用于初始化和配置多點(diǎn)觸摸設(shè)備的函數(shù),它會(huì)根據(jù)設(shè)備的特性和屬性進(jìn)行相應(yīng)的設(shè)置,并啟動(dòng)設(shè)備的硬件以及創(chuàng)建相應(yīng)的 sysfs 屬性組。

(1)hid_parse()函數(shù)

hid_parse()實(shí)現(xiàn)在/include/linux/hid.h中,本質(zhì)上是調(diào)用hid_open_report()解析HW的report:

4f10c810-90d2-11ef-a511-92fbcf53809c.png

hid_open_report()實(shí)現(xiàn)如下:

inthid_open_report(structhid_device*device)
{
structhid_parser*parser;
structhid_itemitem;
unsignedintsize;
__u8*start;
__u8*buf;
__u8*end;
__u8*next;
intret;
inti;
staticint(*dispatch_type[])(structhid_parser*parser,
structhid_item*item)={
hid_parser_main,
hid_parser_global,
hid_parser_local,
hid_parser_reserved
};

if(WARN_ON(device->status&HID_STAT_PARSED))
return-EBUSY;

start=device->dev_rdesc;
if(WARN_ON(!start))
return-ENODEV;
size=device->dev_rsize;

/*call_hid_bpf_rdesc_fixup()ensuresweworkonacopyofrdesc*/
buf=call_hid_bpf_rdesc_fixup(device,start,&size);
if(buf==NULL)
return-ENOMEM;

if(device->driver->report_fixup)
start=device->driver->report_fixup(device,buf,&size);
else
start=buf;

start=kmemdup(start,size,GFP_KERNEL);
kfree(buf);
if(start==NULL)
return-ENOMEM;

device->rdesc=start;
device->rsize=size;

parser=vzalloc(sizeof(structhid_parser));
if(!parser){
ret=-ENOMEM;
gotoalloc_err;
}

parser->device=device;

end=start+size;

device->collection=kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
sizeof(structhid_collection),GFP_KERNEL);
if(!device->collection){
ret=-ENOMEM;
gotoerr;
}
device->collection_size=HID_DEFAULT_NUM_COLLECTIONS;
for(i=0;icollection[i].parent_idx=-1;

ret=-EINVAL;
while((next=fetch_item(start,end,&item))!=NULL){
start=next;

if(item.format!=HID_ITEM_FORMAT_SHORT){
hid_err(device,"unexpectedlongglobalitem
");
gotoerr;
}

if(dispatch_type[item.type](parser,&item)){
hid_err(device,"item%u%u%u%uparsingfailed
",
item.format,(unsigned)item.size,
(unsigned)item.type,(unsigned)item.tag);
gotoerr;
}

if(start==end){
if(parser->collection_stack_ptr){
hid_err(device,"unbalancedcollectionatendofreportdescription
");
gotoerr;
}
if(parser->local.delimiter_depth){
hid_err(device,"unbalanceddelimiteratendofreportdescription
");
gotoerr;
}

/*
*fetchinitialvaluesincasethedevice's
*defaultmultiplierisn'ttherecommended1
*/
hid_setup_resolution_multiplier(device);

kfree(parser->collection_stack);
vfree(parser);
device->status|=HID_STAT_PARSED;

return0;
}
}

hid_err(device,"itemfetchingfailedatoffset%u/%u
",
size-(unsignedint)(end-start),size);
err:
kfree(parser->collection_stack);
alloc_err:
vfree(parser);
hid_close_report(device);
returnret;
}

上述函數(shù)遍歷hid數(shù)據(jù),然后調(diào)用dispatch_type函數(shù)指針數(shù)組指定的四個(gè)函數(shù)解析HID report:

1、hid_parser_main():解析main Item。

2、hid_parser_global():解析Global Item。

3、hid_parser_local():解析local Item。

4、hid_parser_reserved():解析預(yù)留Item。

(2)hid_hw_start()函數(shù)

hid_hw_start()用于開始一個(gè)底層HID硬件:

inthid_hw_start(structhid_device*hdev,unsignedintconnect_mask)
{
interror;

error=hdev->ll_driver->start(hdev);
if(error)
returnerror;

if(connect_mask){
error=hid_connect(hdev,connect_mask);
if(error){
hdev->ll_driver->stop(hdev);
returnerror;
}
}

return0;
}

1、首先調(diào)用hdev->ll_driver->start(hdev),hdev 是一個(gè)指向 hid_device 結(jié)構(gòu)體的指針,ll_driver 則是指向底層驅(qū)動(dòng)的指針。這行代碼調(diào)用了底層驅(qū)動(dòng)中的start 函數(shù),啟動(dòng)了 HID 設(shè)備的硬件。如果啟動(dòng)失敗,start 函數(shù)可能會(huì)返回一個(gè)錯(cuò)誤碼。

2、接著檢查 connect_mask是否為非零值,如果connect_mask不為零,表示需要連接 HID 設(shè)備的某些部分。調(diào)用 hid_connect()函數(shù)連接 HID 設(shè)備,并將connect_mask 作為參數(shù)傳遞給它。如果連接失敗,hid_connect` 函數(shù)可能會(huì)返回一個(gè)錯(cuò)誤碼。

3、如果上述步驟2中出現(xiàn)了錯(cuò)誤,則調(diào)用hdev->ll_driver->stop(hdev),停止HID設(shè)備的硬件,然后函數(shù)返回之前發(fā)生的錯(cuò)誤碼。

4、如果啟動(dòng)和連接都成功,函數(shù)返回0,表示 HID 設(shè)備已經(jīng)成功啟動(dòng)并連接。

(3)hid_connect()函數(shù)

hid_connect()實(shí)現(xiàn)如下:

inthid_connect(structhid_device*hdev,unsignedintconnect_mask)
{
staticconstchar*types[]={"Device","Pointer","Mouse","Device",
"Joystick","Gamepad","Keyboard","Keypad",
"Multi-AxisController"
};
constchar*type,*bus;
charbuf[64]="";
unsignedinti;
intlen;
intret;

//連接HID設(shè)備到BPF(BerkeleyPacketFilter)。如果連接失敗,則返回相應(yīng)的錯(cuò)誤碼。
ret=hid_bpf_connect_device(hdev);
if(ret)
returnret;

//根據(jù)設(shè)備的特性和屬性,設(shè)置了一些連接標(biāo)志位
if(hdev->quirks&HID_QUIRK_HIDDEV_FORCE)
connect_mask|=(HID_CONNECT_HIDDEV_FORCE|HID_CONNECT_HIDDEV);
if(hdev->quirks&HID_QUIRK_HIDINPUT_FORCE)
connect_mask|=HID_CONNECT_HIDINPUT_FORCE;
if(hdev->bus!=BUS_USB)
connect_mask&=~HID_CONNECT_HIDDEV;
if(hid_hiddev(hdev))
connect_mask|=HID_CONNECT_HIDDEV_FORCE;

if((connect_mask&HID_CONNECT_HIDINPUT)&&!hidinput_connect(hdev,
connect_mask&HID_CONNECT_HIDINPUT_FORCE))
hdev->claimed|=HID_CLAIMED_INPUT;

if((connect_mask&HID_CONNECT_HIDDEV)&&hdev->hiddev_connect&&
!hdev->hiddev_connect(hdev,
connect_mask&HID_CONNECT_HIDDEV_FORCE))
hdev->claimed|=HID_CLAIMED_HIDDEV;
if((connect_mask&HID_CONNECT_HIDRAW)&&!hidraw_connect(hdev))
hdev->claimed|=HID_CLAIMED_HIDRAW;

if(connect_mask&HID_CONNECT_DRIVER)
hdev->claimed|=HID_CLAIMED_DRIVER;

/*Driverswiththe->raw_eventcallbacksetarenotrequiredtoconnect
*toanyotherlistener.*/
if(!hdev->claimed&&!hdev->driver->raw_event){
hid_err(hdev,"devicehasnolisteners,quitting
");
return-ENODEV;
}

//處理設(shè)備的數(shù)據(jù)報(bào)文順序
hid_process_ordering(hdev);

//如果設(shè)備被輸入子系統(tǒng)聲明,并且需要連接到力反饋(ForceFeedback),則調(diào)用設(shè)備的力反饋初始化函數(shù)。
if((hdev->claimed&HID_CLAIMED_INPUT)&&
(connect_mask&HID_CONNECT_FF)&&hdev->ff_init)
hdev->ff_init(hdev);

len=0;
if(hdev->claimed&HID_CLAIMED_INPUT)
len+=sprintf(buf+len,"input");
if(hdev->claimed&HID_CLAIMED_HIDDEV)
len+=sprintf(buf+len,"%shiddev%d",len?",":"",
((structhiddev*)hdev->hiddev)->minor);
if(hdev->claimed&HID_CLAIMED_HIDRAW)
len+=sprintf(buf+len,"%shidraw%d",len?",":"",
((structhidraw*)hdev->hidraw)->minor);

type="Device";
for(i=0;imaxcollection;i++){
structhid_collection*col=&hdev->collection[i];
if(col->type==HID_COLLECTION_APPLICATION&&
(col->usage&HID_USAGE_PAGE)==HID_UP_GENDESK&&
(col->usage&0xffff)usage&0xffff];
break;
}
}

switch(hdev->bus){
caseBUS_USB:
bus="USB";
break;
caseBUS_BLUETOOTH:
bus="BLUETOOTH";
break;
caseBUS_I2C:
bus="I2C";
break;
caseBUS_VIRTUAL:
bus="VIRTUAL";
break;
caseBUS_INTEL_ISHTP:
caseBUS_AMD_SFH:
bus="SENSORHUB";
break;
default:
bus="";
}

//創(chuàng)建設(shè)備的sysfs文件。
ret=device_create_file(&hdev->dev,&dev_attr_country);
if(ret)
hid_warn(hdev,
"can'tcreatesysfscountrycodeattributeerr:%d
",ret);

//通過hid_info()函數(shù)打印設(shè)備的連接信息。
hid_info(hdev,"%s:%sHIDv%x.%02x%s[%s]on%s
",
buf,bus,hdev->version>>8,hdev->version&0xff,
type,hdev->name,hdev->phys);

return0;
}

三、hid-multitouch.c應(yīng)用場(chǎng)景

筆者最近需要通過usb方式接入觸摸面板,且該觸摸面板滿足hid協(xié)議,故而使用了內(nèi)核提供的hid-multitouch.c:4f44a5cc-90d2-11ef-a511-92fbcf53809c.png

然后為板卡接入了兩個(gè)hid觸摸面板,如果HID觸摸面板識(shí)別成功,在hid-multitouch目錄下生成了對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)鏈接:4f700442-90d2-11ef-a511-92fbcf53809c.png

經(jīng)驗(yàn)證,內(nèi)核對(duì)目前手里的兩塊hid觸摸面板的數(shù)據(jù)解析正常,觸摸事件上報(bào)正常。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1361

    瀏覽量

    40191
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11212

    瀏覽量

    208734
  • 驅(qū)動(dòng)程序
    +關(guān)注

    關(guān)注

    19

    文章

    818

    瀏覽量

    47909
  • HID
    HID
    +關(guān)注

    關(guān)注

    2

    文章

    129

    瀏覽量

    46542
  • 觸摸面板
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    13553

原文標(biāo)題:原來linux內(nèi)核對(duì)觸摸的支持這么溜

文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux clock子系統(tǒng)及驅(qū)動(dòng)實(shí)例

    Linux驅(qū)動(dòng),操作時(shí)鐘只需要簡單調(diào)用內(nèi)核提供的通用接口即可,clock驅(qū)動(dòng)通常是由芯片廠商
    發(fā)表于 05-31 16:10 ?748次閱讀
    <b class='flag-5'>Linux</b> clock子系統(tǒng)及<b class='flag-5'>驅(qū)動(dòng)</b>實(shí)例

    Linux內(nèi)核container_of原理詳解

    Linux內(nèi)核中經(jīng)常可見container_of的身影,它在實(shí)際驅(qū)動(dòng)的編寫也是廣泛應(yīng)用。
    發(fā)表于 07-14 15:19 ?296次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>container_of原理詳解

    #硬聲創(chuàng)作季 #Linux 學(xué)Linux-4.25.7 觸摸驅(qū)動(dòng)文件添加到Linux內(nèi)核

    LinuxLINUX內(nèi)核
    水管工
    發(fā)布于 :2022年11月10日 21:51:29

    Linux內(nèi)核添加wifi驅(qū)動(dòng)

    Linux內(nèi)核添加wifi驅(qū)動(dòng)Linux WIFI驅(qū)動(dòng)實(shí)驗(yàn)rtl8723 Wifi聯(lián)網(wǎng)測(cè)試
    發(fā)表于 02-05 07:59

    LINUX內(nèi)核驅(qū)動(dòng)第三版(中文)

    LINUX內(nèi)核驅(qū)動(dòng)第三版(中文)
    發(fā)表于 03-11 09:18 ?0次下載

    基于Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究

    Linux因其完全開放的特性和穩(wěn)定優(yōu)良的性能深受歡迎,當(dāng)推出了內(nèi)核輸入子系統(tǒng)后,更方便了嵌入式領(lǐng)域的驅(qū)動(dòng)開放。介紹了Linux的設(shè)備驅(qū)動(dòng)基礎(chǔ)
    發(fā)表于 09-12 16:38 ?23次下載

    linux內(nèi)核驅(qū)動(dòng)第三版

    電子發(fā)燒友網(wǎng)站提供《linux內(nèi)核驅(qū)動(dòng)第三版.txt》資料免費(fèi)下載
    發(fā)表于 04-04 23:40 ?0次下載

    linux2.6內(nèi)核設(shè)備驅(qū)動(dòng)模型精華

    linux 內(nèi)核驅(qū)動(dòng)部分詳解
    發(fā)表于 04-27 10:43 ?20次下載

    Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究

    Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究
    發(fā)表于 10-31 14:41 ?14次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>輸入子系統(tǒng)的<b class='flag-5'>驅(qū)動(dòng)</b>研究

    如何使用Linux內(nèi)核實(shí)現(xiàn)USB驅(qū)動(dòng)程序框架

    Linux內(nèi)核提供了完整的USB驅(qū)動(dòng)程序框架。USB總線采用樹形結(jié)構(gòu),在一條總線上只能有唯一的主機(jī)設(shè)備。 Linux內(nèi)核從主機(jī)和設(shè)備兩個(gè)角度
    發(fā)表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>實(shí)現(xiàn)USB<b class='flag-5'>驅(qū)動(dòng)</b>程序框架

    Linux內(nèi)核代碼60%都是驅(qū)動(dòng)?

    為什么Linux內(nèi)核代碼60%都是驅(qū)動(dòng)? 如果每支持新的設(shè)備就加入驅(qū)動(dòng)內(nèi)核會(huì)不會(huì)變得越來越臃腫?
    的頭像 發(fā)表于 07-11 11:48 ?833次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>代碼60%都是<b class='flag-5'>驅(qū)動(dòng)</b>?

    linux內(nèi)核的driver_register介紹

    linux內(nèi)核注冊(cè)驅(qū)動(dòng)由driver_register()完成。它將驅(qū)動(dòng)程序的信息添加到內(nèi)核驅(qū)動(dòng)
    的頭像 發(fā)表于 07-14 09:17 ?2608次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的driver_register介紹

    什么是通用HID燈鎮(zhèn)流器

    熒光燈鎮(zhèn)流器中有一種典型的簡單高頻驅(qū)動(dòng)方法,但是具有高弧光管壓力的 HID 燈存在聲共振現(xiàn)象(*) 的問題。為了避免這個(gè)問題,HID 燈需要以低于 1kHz 的低頻或直流驅(qū)動(dòng)。
    發(fā)表于 02-02 17:05 ?508次閱讀
    什么是<b class='flag-5'>通用</b><b class='flag-5'>HID</b>燈鎮(zhèn)流器

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng)驅(qū)動(dòng)程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們?cè)试S內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制和管理。
    的頭像 發(fā)表于 08-30 15:02 ?348次閱讀

    深度解析linux HID核心

    linux內(nèi)核HID核心是完成HID功能的關(guān)鍵組件,如果內(nèi)核支持
    的頭像 發(fā)表于 09-29 17:04 ?322次閱讀
    深度解析<b class='flag-5'>linux</b> <b class='flag-5'>HID</b>核心