一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

深度解析linux HID核心

嵌入式小生 ? 來源:嵌入式小生 ? 2024-09-29 17:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、hid核心初始化

linux內(nèi)核中,HID核心是完成HID功能的關(guān)鍵組件,如果內(nèi)核支持HID,在啟動過程中,則會對HID進行初始化,完成該操作的函數(shù)是hid_init(),實現(xiàn)在/drivers/hid/hid-core.c中:

staticint__inithid_init(void)
{
intret;

ret=bus_register(&hid_bus_type);
if(ret){
pr_err("can'tregisterhidbus
");
gotoerr;
}

#ifdefCONFIG_HID_BPF
hid_bpf_ops=&hid_ops;
#endif

ret=hidraw_init();
if(ret)
gotoerr_bus;

hid_debug_init();

return0;
err_bus:
bus_unregister(&hid_bus_type);
err:
returnret;
}

(1)調(diào)用bus_register()注冊hid總線,在總線類型定義中指定了總線名稱、dev_groups、drv_groups、.match、.probe、.remove和.uevent:

conststructbus_typehid_bus_type={
.name="hid",
.dev_groups=hid_dev_groups,
.drv_groups=hid_drv_groups,
.match=hid_bus_match,
.probe=hid_device_probe,
.remove=hid_device_remove,
.uevent=hid_uevent,
};

(2)調(diào)用hidraw_init()初始化hidraw模塊支持,hidraw模塊提供了對hid原始數(shù)據(jù)的直接訪問接口。

(3)調(diào)用hid_debug_init()創(chuàng)建debugfs中的調(diào)試條目hid。

上述則是hid初始化的具體步驟,以模塊的方式構(gòu)建進內(nèi)核,在內(nèi)核啟動過程中自動完成。

二、hid總線probe過程分析

從hid_bus_type總線可以知道,hid總線的probe是hid_device_probe(),函數(shù)定義如下:

staticinthid_device_probe(structdevice*dev)
{
structhid_device*hdev=to_hid_device(dev);
structhid_driver*hdrv=to_hid_driver(dev->driver);
intret=0;

if(down_interruptible(&hdev->driver_input_lock))
return-EINTR;

hdev->io_started=false;
clear_bit(ffs(HID_STAT_REPROBED),&hdev->status);

if(!hdev->driver)
ret=__hid_device_probe(hdev,hdrv);

if(!hdev->io_started)
up(&hdev->driver_input_lock);

returnret;
}

上述函數(shù)將對HID設(shè)備進行探測,如果設(shè)備沒有驅(qū)動程序,則嘗試調(diào)用 __hid_device_probe() 函數(shù)來進行探測。__hid_device_probe()實現(xiàn)如下:

staticint__hid_device_probe(structhid_device*hdev,structhid_driver*hdrv)
{
conststructhid_device_id*id;
intret;

if(!hid_check_device_match(hdev,hdrv,&id))
return-ENODEV;

hdev->devres_group_id=devres_open_group(&hdev->dev,NULL,GFP_KERNEL);
if(!hdev->devres_group_id)
return-ENOMEM;

/*resetthequirksthathasbeenpreviouslyset*/
hdev->quirks=hid_lookup_quirk(hdev);
hdev->driver=hdrv;

if(hdrv->probe){
ret=hdrv->probe(hdev,id);
}else{/*defaultprobe*/
ret=hid_open_report(hdev);
if(!ret)
ret=hid_hw_start(hdev,HID_CONNECT_DEFAULT);
}

if(ret){
devres_release_group(&hdev->dev,hdev->devres_group_id);
hid_close_report(hdev);
hdev->driver=NULL;
}

returnret;
}

上述函數(shù)具體實現(xiàn)細節(jié)如下:

(1)調(diào)用 hid_check_device_match 函數(shù)來檢查設(shè)備是否匹配給定的 HID 驅(qū)動程序。如果不匹配,則返回 -ENODEV,表示設(shè)備不存在。

(2)然后它打開了一個設(shè)備資源組(device resource group),用于管理與設(shè)備相關(guān)的資源。如果打開失敗,則返回 -ENOMEM,表示內(nèi)存不足。

(3)重置先前設(shè)置的 quirks(設(shè)備特性)。quirks 是用來處理一些設(shè)備特定的行為的標志。

(4)將設(shè)備的驅(qū)動程序指針設(shè)置為給定的驅(qū)動程序。

(5)如果給定的驅(qū)動程序有 probe 函數(shù),則調(diào)用該函數(shù)進行設(shè)備探測。否則,調(diào)用默認的探測流程:先調(diào)用 hid_open_report 打開報告通道,然后調(diào)用 hid_hw_start 開始設(shè)備的硬件操作。

(6)如果探測過程中出現(xiàn)錯誤,則釋放先前打開的設(shè)備資源組,關(guān)閉報告通道,并將設(shè)備的驅(qū)動程序指針設(shè)置為 NULL。

(7)最后返回探測的結(jié)果。

__hid_device_probe()主要負責設(shè)置設(shè)備的特性,打開report通道,并調(diào)用特定驅(qū)動程序的探測函數(shù)來啟動該hid設(shè)備。

三、hid總線match過程分析

從hid_bus_type總線可以知道,hid總線的match是hid_bus_match(),函數(shù)定義如下:

staticinthid_bus_match(structdevice*dev,structdevice_driver*drv)
{
structhid_driver*hdrv=to_hid_driver(drv);
structhid_device*hdev=to_hid_device(dev);

returnhid_match_device(hdev,hdrv)!=NULL;
}

首先使用to_hid_driver()和to_hid_device()分別解出hid驅(qū)動hid_driver和hid設(shè)備hid_device,再調(diào)用hid_match_device()匹配設(shè)備和驅(qū)動。hid_match_device()實現(xiàn)如下:

conststructhid_device_id*hid_match_device(structhid_device*hdev,
structhid_driver*hdrv)
{
structhid_dynid*dynid;

spin_lock(&hdrv->dyn_lock);
list_for_each_entry(dynid,&hdrv->dyn_list,list){
if(hid_match_one_id(hdev,&dynid->id)){
spin_unlock(&hdrv->dyn_lock);
return&dynid->id;
}
}
spin_unlock(&hdrv->dyn_lock);

returnhid_match_id(hdev,hdrv->id_table);
}

上述函數(shù)中,首先獲取了 hdrv 的動態(tài)設(shè)備 ID 鎖,并遍歷 hdrv->dyn_list 中的每個動態(tài)設(shè)備 ID(通過一個名為 hid_dynid 的結(jié)構(gòu)體鏈表實現(xiàn))。在每次迭代中,調(diào)用 hid_match_one_id 函數(shù)來檢查當前設(shè)備是否與當前動態(tài)設(shè)備 ID 匹配。如果匹配成功,它釋放鎖并返回找到的設(shè)備 ID。如果在動態(tài)設(shè)備 ID 列表中沒有找到匹配的設(shè)備 ID,則釋放鎖,并調(diào)用 hid_match_id 函數(shù)來嘗試在靜態(tài)設(shè)備 ID 表中匹配設(shè)備。最終,hid_match_device()返回匹配的設(shè)備ID,如果沒有找到匹配的設(shè)備 ID,則返回 NULL。

總的來說,hid_match_device()的作用是在給定的 HID 驅(qū)動程序中查找與給定 HID 設(shè)備匹配的設(shè)備 ID,它首先搜索動態(tài)設(shè)備 ID 列表,然后再搜索靜態(tài)設(shè)備 ID 表。

四、hid總線的uevent過程

從hid_bus_type總線可以知道,hid總線對uevent的處理由hid_uevent()完成:

staticinthid_uevent(conststructdevice*dev,structkobj_uevent_env*env)
{
conststructhid_device*hdev=to_hid_device(dev);

if(add_uevent_var(env,"HID_ID=%04X:%08X:%08X",
hdev->bus,hdev->vendor,hdev->product))
return-ENOMEM;

if(add_uevent_var(env,"HID_NAME=%s",hdev->name))
return-ENOMEM;

if(add_uevent_var(env,"HID_PHYS=%s",hdev->phys))
return-ENOMEM;

if(add_uevent_var(env,"HID_UNIQ=%s",hdev->uniq))
return-ENOMEM;

if(add_uevent_var(env,"MODALIAS=hid:b%04Xg%04Xv%08Xp%08X",
hdev->bus,hdev->group,hdev->vendor,hdev->product))
return-ENOMEM;

return0;
}

上述代碼用于解析 HID(Human Interface Device,人機接口設(shè)備)相關(guān)的信息,并將這些信息填充到內(nèi)核對象環(huán)境(struct kobj_uevent_env)中。這個函數(shù)可能在系統(tǒng)中發(fā)生 HID 設(shè)備事件時被調(diào)用,比如當連接了新的 HID 設(shè)備或移除了現(xiàn)有的 HID 設(shè)備時。具體步驟如下:

const struct hid_device *hdev = to_hid_device(dev);從給定的 device 結(jié)構(gòu)指針 dev 中提取 hid_device 結(jié)構(gòu)指針。通過使用 add_uevent_var函數(shù)向內(nèi)核對象 uevent 環(huán)境中添加各種 HID 相關(guān)信息,該函數(shù)用于向環(huán)境中添加鍵值對,如果 add_uevent_var 失?。ǚ祷胤橇阒担瑒t返回 -ENOMEM,表示內(nèi)存分配失敗。

HID_ID=%04X:%08X:%08X:添加帶有總線、廠商和產(chǎn)品 ID 的 HID ID 信息。

HID_NAME=%s:添加 HID 設(shè)備名稱。

HID_PHYS=%s:添加 HID 設(shè)備的物理位置。

HID_UNIQ=%s:添加 HID 設(shè)備的唯一標識符。

MODALIAS=hid:b%04Xg%04Xv%08Xp%08X:添加 MODALIAS 字符串,用于 Linux 中的設(shè)備識別和驅(qū)動加載。它包括總線、組、廠商和產(chǎn)品。

五、usbhid驅(qū)動分析

在/drivers/hid/usbhid/路徑下同樣存在一個hid-core.c文件,從名稱上很容易與/drivers/hid/hid-core.c混淆,但也不知道為什么內(nèi)核中要用這個名稱來命名。從該文件中代碼可以知道,該份源碼本質(zhì)上是usbhid的驅(qū)動實現(xiàn):

staticint__inithid_init(void)
{
intretval=-ENOMEM;

retval=usbhid_quirks_init(quirks_param);
if(retval)
gotousbhid_quirks_init_fail;
retval=usb_register(&hid_driver);
if(retval)
gotousb_register_fail;
printk(KERN_INFOKBUILD_MODNAME":"DRIVER_DESC"
");

return0;
usb_register_fail:
usbhid_quirks_exit();
usbhid_quirks_init_fail:
returnretval;
}

staticvoid__exithid_exit(void)
{
usb_deregister(&hid_driver);
usbhid_quirks_exit();
}

module_init(hid_init);
module_exit(hid_exit);

在hid_init()中完成了以下操作:

1、調(diào)用 usbhid_quirks_init() 函數(shù)來初始化 USB HID 設(shè)備的特殊處理,quirks_param 是參數(shù),用來傳遞特定的配置或修正信息。

2、注冊 HID 驅(qū)動程序。hid_driver 是一個結(jié)構(gòu)體,它包含了驅(qū)動程序的相關(guān)信息,usb_register() 函數(shù)將這個驅(qū)動程序注冊到 USB 子系統(tǒng)中。

(1)struct hid_driver

struct hid_driver實現(xiàn)如下:

staticstructusb_driverhid_driver={
.name="usbhid",
.probe=usbhid_probe,
.disconnect=usbhid_disconnect,
#ifdefCONFIG_PM
.suspend=hid_suspend,
.resume=hid_resume,
.reset_resume=hid_reset_resume,
#endif
.pre_reset=hid_pre_reset,
.post_reset=hid_post_reset,
.id_table=hid_usb_ids,
.supports_autosuspend=1,
};

(2)usbhid的探測行為

usbhid的探測行為由usbhid_probe()完成:

staticintusbhid_probe(structusb_interface*intf,conststructusb_device_id*id)
{
structusb_host_interface*interface=intf->cur_altsetting;
structusb_device*dev=interface_to_usbdev(intf);
structusbhid_device*usbhid;
structhid_device*hid;
unsignedintn,has_in=0;
size_tlen;
intret;

dbg_hid("HIDprobecalledforifnum%d
",
intf->altsetting->desc.bInterfaceNumber);

for(n=0;ndesc.bNumEndpoints;n++)
if(usb_endpoint_is_int_in(&interface->endpoint[n].desc))
has_in++;
if(!has_in){
hid_err(intf,"couldn'tfindaninputinterruptendpoint
");
return-ENODEV;
}

//分配一個hid_device結(jié)構(gòu)體并將其指針賦給hid,用于表示HID設(shè)備。
hid=hid_allocate_device();
if(IS_ERR(hid))
returnPTR_ERR(hid);

//將hid結(jié)構(gòu)體指針與USB接口相關(guān)聯(lián),以便后續(xù)可以通過接口訪問HID設(shè)備。
usb_set_intfdata(intf,hid);

//指定hid_device結(jié)構(gòu)體的底層驅(qū)動為usb_hid_driver驅(qū)動。
hid->ll_driver=&usb_hid_driver;
hid->ff_init=hid_pidff_init;
#ifdefCONFIG_USB_HIDDEV
hid->hiddev_connect=hiddev_connect;
hid->hiddev_disconnect=hiddev_disconnect;
hid->hiddev_hid_event=hiddev_hid_event;
hid->hiddev_report_event=hiddev_report_event;
#endif
hid->dev.parent=&intf->dev;
hid->bus=BUS_USB;//指定hid設(shè)備位于usb總線上
hid->vendor=le16_to_cpu(dev->descriptor.idVendor);
hid->product=le16_to_cpu(dev->descriptor.idProduct);
hid->name[0]=0;
hid->quirks=usbhid_lookup_quirk(hid->vendor,hid->product);
if(intf->cur_altsetting->desc.bInterfaceProtocol==
USB_INTERFACE_PROTOCOL_MOUSE)
hid->type=HID_TYPE_USBMOUSE;
elseif(intf->cur_altsetting->desc.bInterfaceProtocol==0)
hid->type=HID_TYPE_USBNONE;

if(dev->manufacturer)
strlcpy(hid->name,dev->manufacturer,sizeof(hid->name));

if(dev->product){
if(dev->manufacturer)
strlcat(hid->name,"",sizeof(hid->name));
strlcat(hid->name,dev->product,sizeof(hid->name));
}

if(!strlen(hid->name))
snprintf(hid->name,sizeof(hid->name),"HID%04x:%04x",
le16_to_cpu(dev->descriptor.idVendor),
le16_to_cpu(dev->descriptor.idProduct));

//通過USB設(shè)備獲取HID設(shè)備的物理路徑。
usb_make_path(dev,hid->phys,sizeof(hid->phys));
strlcat(hid->phys,"/input",sizeof(hid->phys));
len=strlen(hid->phys);
if(lenphys)-1)
snprintf(hid->phys+len,sizeof(hid->phys)-len,
"%d",intf->altsetting[0].desc.bInterfaceNumber);

if(usb_string(dev,dev->descriptor.iSerialNumber,hid->uniq,64)<=?0)
??hid->uniq[0]=0;

usbhid=kzalloc(sizeof(*usbhid),GFP_KERNEL);
if(usbhid==NULL){
ret=-ENOMEM;
gotoerr;
}

hid->driver_data=usbhid;
usbhid->hid=hid;
usbhid->intf=intf;
usbhid->ifnum=interface->desc.bInterfaceNumber;

init_waitqueue_head(&usbhid->wait);
INIT_WORK(&usbhid->reset_work,hid_reset);
setup_timer(&usbhid->io_retry,hid_retry_timeout,(unsignedlong)hid);
spin_lock_init(&usbhid->lock);

//將HID設(shè)備添加到系統(tǒng)中。
ret=hid_add_device(hid);
if(ret){
if(ret!=-ENODEV)
hid_err(intf,"can'taddhiddevice:%d
",ret);
gotoerr_free;
}

return0;
err_free:
kfree(usbhid);
err:
hid_destroy_device(hid);
returnret;
}

(3)usb_hid_driver實現(xiàn)

staticstructhid_ll_driverusb_hid_driver={
.parse=usbhid_parse,//用于解析USBHID設(shè)備的輸入報告。
.start=usbhid_start,//用于啟動USBHID設(shè)備。
.stop=usbhid_stop,//用于停止USBHID設(shè)備。
.open=usbhid_open,//用于打開USBHID設(shè)備。
.close=usbhid_close,//用于關(guān)閉USBHID設(shè)備。
.power=usbhid_power,//用于控制USBHID設(shè)備的電源狀態(tài)。
.request=usbhid_request,//用于向USBHID設(shè)備發(fā)送請求。
.wait=usbhid_wait_io,//用于等待USBHID設(shè)備的輸入/輸出操作完成。
.raw_request=usbhid_raw_request,//用于向USBHID設(shè)備發(fā)送原始請求。
.output_report=usbhid_output_report,//用于向USBHID設(shè)備發(fā)送輸出報告。
.idle=usbhid_idle,//用于設(shè)置USBHID設(shè)備的空閑狀態(tài)。
};

struct hid_ll_driver描述了hid底層驅(qū)動具體的回調(diào)函數(shù),在這里則實現(xiàn)了對于底層hid設(shè)備的具體操作實現(xiàn),通過這些接口函數(shù)可以實現(xiàn)對 USB HID設(shè)備的控制、數(shù)據(jù)傳輸?shù)裙δ堋?/p>

上述usb_hid_driver結(jié)構(gòu)中的函數(shù)指會在使用HID的API時被間接調(diào)用,例如對于.parse指定的回調(diào)函數(shù)usbhid_parse(),則會在usbhid_parse()這個接口中調(diào)用執(zhí)行:

15ae12901545cf4bc689c9d425102c87.png

六、總結(jié)

hid核心的功能大致可總結(jié)如下:

(1)設(shè)備注冊和注銷:包括設(shè)備的注冊、注銷和初始化函數(shù),用于將 HID 設(shè)備與對應(yīng)的驅(qū)動程序關(guān)聯(lián)起來,并在設(shè)備連接或斷開時進行處理。

(2)事件處理:包括從 HID 設(shè)備接收事件數(shù)據(jù)的函數(shù)和處理這些事件數(shù)據(jù)的代碼,這些事件數(shù)據(jù)可能來自于鍵盤、鼠標、游戲手柄等輸入設(shè)備。

(3)設(shè)備識別與匹配:包括用于識別和匹配 HID 設(shè)備的函數(shù),這些函數(shù)通常用于確定哪個驅(qū)動程序適合于連接到系統(tǒng)的特定設(shè)備。

(4)報告解析:包括解析 HID 設(shè)備發(fā)送的報告數(shù)據(jù)的函數(shù),以便將其轉(zhuǎn)換為更易于理解的格式,并將其傳遞給適當?shù)挠脩艨臻g或內(nèi)核空間應(yīng)用程序。

(5)驅(qū)動程序注冊:包括注冊和注銷 HID 驅(qū)動程序的函數(shù),這些函數(shù)用于將驅(qū)動程序添加到系統(tǒng)中以處理特定類型的 HID 設(shè)備。

(6)錯誤處理和調(diào)試功能:包括用于處理設(shè)備連接和通信中出現(xiàn)的錯誤以及調(diào)試信息輸出的函數(shù)。

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

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41444
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213845
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64906

原文標題:一文探秘linux HID核心

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Zstack中串口操作的深度解析(一)

    本帖最后由 eehome 于 2013-1-5 10:06 編輯 Zstack中串口操作的深度解析(一)歡迎研究ZigBee的朋友和我交流。。。
    發(fā)表于 08-12 21:11

    I2C通信設(shè)計深度解析

    I2C通信設(shè)計深度解析
    發(fā)表于 08-12 21:31

    深度搜索Linux操作系統(tǒng):系統(tǒng)構(gòu)建和原理解析

    深度搜索Linux操作系統(tǒng):系統(tǒng)構(gòu)建和原理解析!比較好的一本Linux內(nèi)核書籍,從另一個角度去解釋!
    發(fā)表于 09-16 16:40

    java經(jīng)典面試題深度解析

    免費視頻教程:java經(jīng)典面試題深度解析對于很多初學(xué)者來說,學(xué)好java在后期面試的階段都沒什么經(jīng)驗,為了讓大家更好的了解面試相關(guān)知識,今天在這里給大家分享了一個java經(jīng)典面試題深度解析
    發(fā)表于 06-20 15:16

    【銀杏科技ARM+FPGA雙核心應(yīng)用】STM32H7系列28——USB_HID

    `一、硬件平臺二、實驗簡介 USB HID是HumanInterface Device的縮寫,由其名稱可以了解HID設(shè)備是直接與人交互的設(shè)備,例如鍵盤、鼠標與游戲桿等。不過HID設(shè)備并不一定
    發(fā)表于 04-20 17:31

    【銀杏科技ARM+FPGA雙核心應(yīng)用】STM32H7系列37——USB_HID_FS

    `一、硬件平臺二、實驗簡介 USB HID是HumanInterface Device的縮寫,由其名稱可以了解HID設(shè)備是直接與人交互的設(shè)備,例如鍵盤、鼠標與游戲桿等。不過HID設(shè)備并不一定
    發(fā)表于 04-30 12:12

    解析深度學(xué)習(xí):卷積神經(jīng)網(wǎng)絡(luò)原理與視覺實踐

    解析深度學(xué)習(xí):卷積神經(jīng)網(wǎng)絡(luò)原理與視覺實踐
    發(fā)表于 06-14 22:21

    功能安全---AUTOSAR架構(gòu)深度解析 精選資料分享

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析AUTOSAR的分層式設(shè)計,用于支持完整的軟件和硬件模塊的獨立性(Independence),中間RTE(Runtime
    發(fā)表于 07-23 08:34

    AUTOSAR架構(gòu)深度解析 精選資料推薦

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析目錄AUTOSAR架構(gòu)深度解析A
    發(fā)表于 07-28 07:40

    AUTOSAR架構(gòu)深度解析 精選資料分享

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析AUTOSAR的分層式設(shè)計,用于支持完整的軟件和硬件模塊的獨立性(Independence),中間RTE(Runtime
    發(fā)表于 07-28 07:02

    C語言深度解析

    C語言深度解析,本資料來源于網(wǎng)絡(luò),對C語言的學(xué)習(xí)有很大的幫助,有著較為深刻的解析,可能會對讀者有一定的幫助。
    發(fā)表于 09-28 07:00

    嵌入式Linux與物聯(lián)網(wǎng)軟件開發(fā)C語言內(nèi)核深度解析書籍的介紹

    嵌入式Linux與物聯(lián)網(wǎng)軟件開發(fā)——C語言內(nèi)核深度解析 C語言是嵌入式Linux領(lǐng)域的主要開發(fā)語言。對于學(xué)習(xí)嵌入式、單片機、Linux驅(qū)動開
    發(fā)表于 05-15 18:10 ?9次下載
    嵌入式<b class='flag-5'>Linux</b>與物聯(lián)網(wǎng)軟件開發(fā)C語言內(nèi)核<b class='flag-5'>深度</b><b class='flag-5'>解析</b>書籍的介紹

    linux無法解析域名怎么辦

    由于linux中沒有DNS導(dǎo)致無法解析域名。
    發(fā)表于 05-21 09:23 ?2464次閱讀
    <b class='flag-5'>linux</b>無法<b class='flag-5'>解析</b>域名怎么辦

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

    linux內(nèi)核中,為HID觸摸面板實現(xiàn)了一個通用的驅(qū)動程序,位于/drivers/hid/hid-multitouch.c文件中。hid
    的頭像 發(fā)表于 10-29 10:55 ?2340次閱讀
    <b class='flag-5'>linux</b>內(nèi)核中通用<b class='flag-5'>HID</b>觸摸驅(qū)動

    Nginx核心功能深度解析

    Nginx核心功能深度解析
    的頭像 發(fā)表于 05-09 10:50 ?294次閱讀