Linux底層通過IOCTL方式與上層進(jìn)行交互

linux4.9通過ioctl進(jìn)行底層和上層通訊的功能说莫,其中已實(shí)現(xiàn)應(yīng)用層通過初始化底層設(shè)備參數(shù),以及先給底層設(shè)備設(shè)置所需要讀取的內(nèi)容奢入,再獲取設(shè)備對(duì)應(yīng)內(nèi)容產(chǎn)生的數(shù)據(jù)展辞。


公共參數(shù)如下:

????????typedef struct {

????????????int channel_value;

????????????int adc_value;

? ? ? ? }TEST_ADC_CONFIG_READ;

????????#define TESTADC_IOC_MAGIC 'a'

????????#define IOCTL_TEST_INIT? _IO(TESTADC_IOC_MAGIC, 0)

????????#define IOCTL_TEST_SET_CHANNEL_READ_VALUE? _IO(TESTADC_IOC_MAGIC, 1)

底層部分:

? ? 1:申明一個(gè)misc設(shè)備,以及其自帶的文件操作接口

????????#define DEVICE_NAME kyan

? ? ? ? static const struct file_operations kyan_fops =

? ? ? ? {

? ? ? ? ? ? .open? ? = ms_kyan_open,

? ? ? ? ? ? .unlocked_ioctl = ms_kyan_ioctl,

? ? ? ? };

? ? ? ? static struct miscdevice kyan_miscdev = {MISC_DYNAMIC_MINOR, DEVICE_NAME, &kyan_fops};

? ? 2:通過設(shè)備注冊(cè)將misc設(shè)備注冊(cè)進(jìn)內(nèi)核划提,注冊(cè)成功之后會(huì)在dev目錄下新建命名為kyan的文件枫弟。

? ? ? ? misc_register(&kyan_miscdev);

? ? 3:當(dāng)?shù)讓愉N毀時(shí),將來注銷misc設(shè)備

? ? ? ? misc_deregister(&kyan_miscdev);

? ? 4:ioctl函數(shù)實(shí)現(xiàn)

????????????#define TEST_ADC_CONFIG_READ adctest //申明一個(gè)adc配置對(duì)象用于數(shù)據(jù)的設(shè)置和采集

? ? ? ????? static long ms_kyan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

? ? ? ????? {

? ? ? ? ? ????? switch(cmd)

? ? ? ? ????? ? {

? ? ? ? ????? ? case IOCTL_TEST_INIT:

? ? ? ? ? ? ? ????? //此處可增加初始化該設(shè)備參數(shù)的功能函數(shù)

? ? ? ? ? ? ? ????? break;

? ? ? ? ????? ? case IOCTL_TEST_SET_CHANNEL_READ_VALUE:

? ? ? ? ? ? ? ????? //此處可直接操作應(yīng)用層對(duì)底層的讀和寫功能

? ? ? ? ? ? ? ????? //分別使用copy_from_user獲取用戶空間數(shù)據(jù)鹏往,來進(jìn)行底層功能的設(shè)置淡诗,或者通過使用copy_to_user將來底層數(shù)據(jù)傳給用戶空間

? ? ? ? ? ? ? ????? if(copy_from_user(&adctest, (TEST_ADC_CONFIG_READ __user *)arg, sizeof(TEST_ADC_CONFIG_READ)))

? ? ? ? ? ? ? ????? {

? ? ? ? ? ? ? ????? ? ? return EFAULT;

? ? ? ? ? ? ? ????? }

? ? ? ? ? ? ? ????? channel = adctest.channel_value & 3;//由于底層chanel的值只有0、1伊履、2韩容、3 四種狀態(tài),所以此處可以直接與上3進(jìn)行取值唐瀑。

? ? ? ? ? ? ? ????? adctest.adc_value = ms_kyan_get(channel);//此處為底層數(shù)據(jù)的實(shí)際讀取函數(shù)群凶,該函數(shù)可通過直接讀取寄存器方式進(jìn)行數(shù)據(jù)的獲取

? ? ? ? ? ? ? ????? printk("channel = %d , adc =%d \n",channel, adctest.adc_value);

? ? ? ? ? ? ? ????? if(copy_to_user((TEST_ADC_CONFIG_READ __user *)arg, &adctest, sizeof( TEST_ADC_CONFIG_READ)))

? ? ? ? ? ? ????? ? {

? ? ? ? ? ? ? ????? ? ? return EFAULT;

? ? ? ? ? ? ? ????? }

? ? ? ? ? ? ? ????? break;

? ? ? ? ? ? default:

? ? ? ? ? ? ? ? printk("ioctl: unknown command\n");

? ? ? ? ? ? ? ? return -ENOTTY;

? ? ? ? ? ? }

? ? ? ? }

? ? 5:編譯報(bào)錯(cuò)

如果在編譯過程中報(bào)以下錯(cuò)時(shí),主要因?yàn)槲丛黾?include <linux/uaccess.h>頭文件哄辣。

應(yīng)用層部分:

1:定義采樣對(duì)象的變量请梢,主要通過該變量與底層進(jìn)行交互

????????TEST_ADC_CONFIG_READ adctest;

2:打開dev下對(duì)應(yīng)的設(shè)備以供后續(xù)操作

????????int fd = open("/dev/kyan", O_WRONLY);

3:通過ioctl機(jī)制配置底層參數(shù)以及進(jìn)行設(shè)置和數(shù)據(jù)采集

????????ioctl(fd, IOCTL_TEST_INIT, NULL)//對(duì)底層功能進(jìn)行初始化

????????ioctl(fd, IOCTL_TEST_SET_CHANNEL_READ_VALUE, &adctest)//對(duì)底層所需要獲取的值進(jìn)行設(shè)置以及數(shù)據(jù)的讀取

4:獲取底層上報(bào)的數(shù)據(jù)

????????printf("SAR: get value %d\n", adctest.adc_value);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赠尾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毅弧,更是在濱河造成了極大的恐慌萍虽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件形真,死亡現(xiàn)場離奇詭異,居然都是意外死亡超全,警方通過查閱死者的電腦和手機(jī)咆霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘶朱,“玉大人蛾坯,你說我怎么就攤上這事∈瓒簦” “怎么了脉课?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長财异。 經(jīng)常有香客問我倘零,道長,這世上最難降的妖魔是什么戳寸? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任呈驶,我火速辦了婚禮,結(jié)果婚禮上疫鹊,老公的妹妹穿的比我還像新娘袖瞻。我一直安慰自己,他們只是感情好拆吆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布聋迎。 她就那樣靜靜地躺著,像睡著了一般枣耀。 火紅的嫁衣襯著肌膚如雪霉晕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天奕枢,我揣著相機(jī)與錄音娄昆,去河邊找鬼。 笑死缝彬,一個(gè)胖子當(dāng)著我的面吹牛萌焰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谷浅,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扒俯,長吁一口氣:“原來是場噩夢啊……” “哼奶卓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撼玄,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤夺姑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掌猛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盏浙,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年荔茬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了废膘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慕蔚,死狀恐怖丐黄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孔飒,我是刑警寧澤灌闺,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坏瞄,受9級(jí)特大地震影響桂对,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惦积,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一接校、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狮崩,春花似錦蛛勉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坦敌,卻和暖如春侣诵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狱窘。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工杜顺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蘸炸。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓躬络,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搭儒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穷当,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容