freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于linux操作系統(tǒng)下rtc驅(qū)動開發(fā)(文件)

2025-06-27 08:39 上一頁面

下一頁面
 

【正文】 ⑹ /documentation 該目錄下是對每個目錄作用的具體說明的文檔以 及一些功能的實例,就相當(dāng)于產(chǎn)品說明書。 基于 Linux 操作系統(tǒng)下 RTC 驅(qū)動開發(fā) 10 第 5 章 RTC 芯片 RTC 芯片簡述 RTC(real time clock)實時時鐘,顧名思義,擁有真實時間的時鐘,其實它的主要作用就是在操作系統(tǒng)沒有工作的時候自主維護時間表,并在需要的時候給操作 系統(tǒng)提供系統(tǒng)時間。當(dāng) Linux內(nèi)核啟動時,都要通過 RTC 來進行初始化,從 RTC 中讀取時間保存到系統(tǒng)中,得到系統(tǒng)時間。另外一鐘新接口是基于 Linux 設(shè)備驅(qū)動程序的。本文就是 介紹基于 I2C總線的 Linux字符設(shè)備驅(qū)動。 insmod 將模塊動態(tài)加載到正在運行內(nèi)核; rmmod 程序移除模塊; Linux 內(nèi)核模塊的程序結(jié)構(gòu): ⑴ module_init()—— 加載模塊函數(shù)(必須) 使用 insmod 命令加載模塊時,內(nèi)核就會執(zhí)行該模塊的加載函數(shù),也就是說這就是整個模塊函數(shù)的入口,就是通過它來完成模塊的初始化相關(guān)工作。 ⑸ EXPORT_SYMBOL()—— 模塊導(dǎo)出符號(可選) 這個函數(shù)括號內(nèi)也放置著數(shù)量不等參數(shù),也就是 符號(可以是 函數(shù)或變量),而在這個模塊結(jié)束之后,其他模塊就可以通過這個符號使用本模塊中這些到處的參數(shù),變量或函數(shù)。 字符設(shè)備開發(fā)基本步驟 ⑴ 向內(nèi)核 確定主該設(shè)備的主次設(shè)備號 ⑵ 實現(xiàn)字符驅(qū)動程序: ? 填充 file_operations 結(jié)構(gòu)體 ? 實現(xiàn)模塊加載函數(shù)用以注冊字符設(shè)備 ? 實現(xiàn)模塊卸載函數(shù)完成模塊的釋放和刪除 ⑶ 創(chuàng)建設(shè)備文件節(jié)點 主、次設(shè)備號 [11] ⑴ 主設(shè)備號是內(nèi)核識別一個設(shè)備的標(biāo)識 。 ⑶ 設(shè)備編號的內(nèi)部表達 ? dev_t 類型 (32 位,其中主設(shè)備號 12 位,次設(shè)備號 20 位 ): 是屬于 Linux 內(nèi)核編程的專有類型,用來保存設(shè)備編號。 ⑸ 動態(tài)分配主設(shè)備號: include linux/ //這是 Linux 內(nèi)核中有關(guān)設(shè)備號的頭文件 int alloc_chrdev_resion(dev_t *, unsigned int , unsigned int , char *rtc); 這是內(nèi)核自動分配一個設(shè)備好給 rtc。 ⑴ cdev 結(jié)構(gòu)體 struct cdev { struct kobject xxx。 /*不常用 */ dev_t xxx。 基于 Linux 操作系統(tǒng)下 RTC 驅(qū)動開發(fā) 14 ⑶ file_operations 的主要成員: struct module *xxx: 指向模塊本身 open: 提供打開設(shè)備的函數(shù)接口; release:提供關(guān)閉設(shè)備的函數(shù)接口; read: 實現(xiàn)從設(shè)備上讀取數(shù)據(jù)的函數(shù)接口; write: 實現(xiàn)向設(shè)備上寫入數(shù)據(jù)的函數(shù)接口; ioctl: I/O 控制函數(shù); llseek: 定位讀寫指針位置并把他們輸出出來; ⑷ ioctl 函數(shù) 為設(shè)備驅(qū)動程序執(zhí)行用戶空間的“命令”提供了一個特有的接口用來設(shè)置或者讀取設(shè)備的具體信息。 蚌埠學(xué)院本科畢業(yè)設(shè)計(論文) 15 case RTC_SET_TIME: ... break。這種方式更快,也節(jié)省了內(nèi)核資源,控制了內(nèi)核的大小,而模塊一旦被插入內(nèi)核,就和其他被直接初始化到內(nèi)核中的模塊一樣了。 int min。 int year。 }。rtc_devt, 0, RTC_DEV_MAX, rtc)。 return 0。 rtc_foperations rtc 基本的文件操作 : static const struct file_operations rtc_foperations = { .owner = THIS_MODULE, .llseek = null, .read = read, .poll = poll, .unlocked_ioctl = ioctl, .open = openfile, .release = release, .fasync = fasync, }。 實際運行及結(jié)果 將生成的 .ko 模塊和應(yīng)用層測試程序 qq 下載的目標(biāo)板,運行過程如圖 72: 用 insmod 裝載模板。并采用了模塊化的指導(dǎo)設(shè)計方法開發(fā)設(shè)備驅(qū)動,提高了程序的可讀性和可移植性。 蚌埠學(xué)院本科畢業(yè)設(shè)計(論文) 21 謝 辭 首先,向我的指導(dǎo)老師趙老師和劉老師表示感謝,感謝老師們一直以來對我的關(guān)懷和悉心指導(dǎo),并在完成畢業(yè)設(shè)計的過程中讓我體會到了也學(xué)到了很多。感謝他們不厭其煩地指導(dǎo)我解決了不少項目上的難題,她們積極向上的學(xué)習(xí)態(tài)度也是我奮斗下去的動力。 static DEFINE_MUTEX(idr_lock)。idr_lock)。idr_lock)。 defined(CONFIG_RTC_HCTOSYS_DEVICE) static struct timespec old_rtc, old_system, old_delta。 if (strcmp(dev_name(amp。 if ( 2 || = 2) { old_delta = delta。 struct rtc_time tm。rtcdev), CONFIG_RTC_HCTOSYS_DEVICE) != 0) return 0。tm)。 return 0。 = 0。 } sleep_time = timespec_sub(new_rtc, old_rtc)。 return 0。 if (idr_pre_get(amp。idr_lock)。 mutex_unlock(amp。 MAX_ID_MASK。 } rtcid = id。 rtcmax_user_freq = 64。 mutex_init(amp。 spin_lock_init(amp。 timerqueue_init_head(amp。 rtc_timer_init(amp。 hrtimer_init(amp。 err = __rtc_read_alarm(rtc, amp。 !rtc_valid_tm(amp。 dev_set_name(amp。rtcdev)。 } rtc_dev_add_device(rtc)。rtcdev))。idr_lock)。idr_lock)。 void rtc_device_unregister(struct rtc_device *rtc) { if (get_device(amp。 rtc_dev_del_device(rtc)。 rtcops = NULL。rtcdev)。t create class\n, __FILE__)。 rtc_dev_init()。 class_destroy(rtc_class)。 module_exit(rtc_exit)。 include linux/ include linux/ include linux/ include static dev_t rtc_devt。 if (test_and_set_bit_lock(RTC_DEV_BUSY, amp。 if (err == 0) { spin_lock_irq(amp。 struct rtc_time tm。 } clear_bit_unlock(RTC_DEV_BUSY, amp。 int err。rtcirq_lock)。 rtc = jiffies + HZ (HZ/10)。rtcuie_timer)。rtcirq_lock)。 spin_lock_irqsave(amp。 if ((schedule_work(amp。 } static int clear_uie(struct rtc_device *rtc) { spin_lock_irq(amp。rtcirq_lock)。rtcirq_lock)。 flush_scheduled_work()。 } spin_unlock_irq(amp。 int err。 spin_lock_irq(amp。 rtcoldsecs = 。 基于 Linux 操作系統(tǒng)下 RTC 驅(qū)動開發(fā) 32 } rtcirq_data = 0。 } int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, unsigned int enabled) { if (enabled) return set_uie(rtc)。 DECLARE_WAITQUEUE(wait, current)。amp。wait)。 data = rtcirq_data。 if (data != 0) { 蚌埠學(xué)院本科畢業(yè)設(shè)計(論文) 33 ret = 0。 break。 } while (1)。wait)。 count == sizeof(unsigned int)) ret = put_user(data, (unsigned int __user *)buf) ?:sizeof(unsigned int)。 unsigned long data。 return (data != 0) ? (POLLIN | POLLRDNORM) : 0。 struct rtc_time tm。rtcops_lock)。 case RTC_IRQP_SET: if (arg rtcmax_user_freq amp。 case RTC_PIE_ON: if (rtcirq_freq rtcmax_user_freq amp。 } 蚌埠學(xué)院本科畢業(yè)設(shè)計(論文) 35 if (err) goto done。alarm)。 return err。, uarg, sizeof(tm))) return EFAULT。 = 1。tm)。now)。 err = rtc_valid_tm(amp。, amp。 = 。alarm)。tm)。 return err。tm, uarg, sizeof(tm))) return EFAULT。 break。rtcops_lock)。 break。tm)。rtcops_lock)。 if (copy_to_user(uarg, amp。rtcops_lock)。 = 。 if (then now) { rtc_time_to_tm(now + 24 * 60 * 60, amp。 基于 Linux 操作系統(tǒng)下 RTC 驅(qū)動開發(fā) 36 if (err 0) return err。 = 。 rtc_tm_to_time(amp。 { unsigned long now, then。 = 0。rtcops_lock)。 if (copy_to_user(uarg, amp。rtcops_lock)。 !capable(CAP_SYS_RESOURCE)) err = EACCES。 !capable(CAP_SYS_RESOURCE)) err = EACCES。 switch (cmd) { case RTC_EPOCH_SET: case RTC_SET_TIME: if (!capable(CAP_SYS_TIME)) err = EACCES。 void __user *uarg = (void __user *) arg。 struct rtc_device *rtc = fileprivate_data。rtcirq_queue, wait)。 } return ret。 if (sizeof(int) != sizeof(long) amp。 remove_wait_queue(amp。 break。 } if (filef_flags amp。 spin_unlock_irq(amp。 spin_lock_irq(amp。 add_wait_queue(amp。 ssize_t ret。 } EXPORT_SYMBOL(rtc_dev_update_irq_enable_emul)。rtcirq_lock)。 if (schedule_work(amp。 if (!rtcuie_irq_
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1