最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux設(shè)備驅(qū)動程序移植全過程

 更新時間:2025年10月17日 15:08:00   作者:大聰明-PLUS  
文章介紹了將舊版Linux內(nèi)核設(shè)備驅(qū)動程序移植到新版內(nèi)核的基本流程,包括代碼復(fù)制、配置文件修改、集成到內(nèi)核構(gòu)建、修復(fù)相關(guān)錯誤,并分享了常見問題及解決方法,旨在為驅(qū)動移植提供參考

介紹

有時需要升級到較新版本的 Linux 內(nèi)核,并因此需要移植現(xiàn)有的設(shè)備驅(qū)動程序。 

移植過程可能需要幾分鐘甚至更長時間。這不僅取決于驅(qū)動程序的復(fù)雜度,還取決于您要升級的內(nèi)核版本(API 往往會發(fā)生變化,而所有問題都源于此),以及代碼實現(xiàn)的質(zhì)量。有時重寫比移植更容易,但我們不會討論這個問題。 

遺憾的是,我無法附上驅(qū)動程序的源代碼,但我們會涵蓋您和我在移植過程中可能遇到的所有問題。下面,我們將看一個將簡單驅(qū)動程序從內(nèi)核版本 2.6.25 移植到 4.12.5 的示例,該驅(qū)動程序位于 drivers/serial/name_uart.c 中。

問題陳述

任務(wù)非常簡單直接:我們需要將上述驅(qū)動程序從內(nèi)核版本 2.6.25 移植到 4.12.5。 

執(zhí)行

首先,如果你不熟悉你正在移植的驅(qū)動程序,我建議你至少簡單研究一下。這可以使任務(wù)變得容易得多。之后,你就可以開始移植了。 

第一步: 

  • 我們的驅(qū)動程序在 2.6.25 內(nèi)核中有以下路徑:drivers/serial/name_uart.c現(xiàn)在我們需要找到一個合適的目錄來放置它。
  • 在這里我們遇到了第一個問題:4.12.5 內(nèi)核中沒有 drivers/serial/ 這樣的目錄。 
  • 解決方案很簡單:只需將我們的驅(qū)動程序放在drivers/tty/serial/name_uart.c中 

第二步:

  • 之后,為了確保 Linux 可以在構(gòu)建中包含我們的驅(qū)動程序,我們需要將它添加到兩個文件中。 
  • 第一個文件是:drivers/tty/serial/Makefile 。
  • 在其中添加以下行: 
obj-$(CONFIG_SERIAL_NAME)	+= name_uart.o
  • 第二個文件:drivers/tty/serial/Kconfig
  • 我們在里面寫入以下內(nèi)容: 
config SERIAL_NAME
	tristate "SERIAL_NAME UART driver"
	help
	  Write description here

第三步: 

  • 完成前兩步后,我們就可以開始構(gòu)建了。 
  • 在根目錄下,運行 make menuconfig 并將我們的驅(qū)動程序包含在構(gòu)建中。
  • 運行該命令后,會打開一個圖形界面,在那里找到我們的驅(qū)動程序應(yīng)該沒有問題(您可以按 / 鍵并輸入完整或部分名稱,然后按 Enter 鍵進行搜索)。 
  • 另一種選擇是直接編輯 .config 文件,并將您的驅(qū)動程序包含在構(gòu)建中。 
  • 接下來,您可以嘗試構(gòu)建包含我們驅(qū)動程序的內(nèi)核。 

第四步: 

  • 嘗試構(gòu)建內(nèi)核后,我們可能會遇到一系列錯誤,需要解決這些錯誤才能成功構(gòu)建內(nèi)核并確保測試驅(qū)動程序的功能。 
  • 我遇到的錯誤是由于與 proc 系統(tǒng)交互的接口過時以及一個宏被刪除造成的。 
  • 例如,在內(nèi)核 2.6.25 中調(diào)用 irequest_irq 函數(shù)可以正常工作,但是
irequest_irq(64 + ISC_DMA, dma_interrupt_handler, IRQF_DISABLED, "DMA", NULL);

在內(nèi)核 4.12.5 中,IRQF_DISABLED 宏已被移除,導(dǎo)致驅(qū)動程序無法構(gòu)建。

解決方案是用 0 替換 IRQF_DISABLED。 

irequest_irq(64 + ISC_DMA, dma_interrupt_handler, 0, "DMA", NULL);

下一個 bug 是,在內(nèi)核版本 2.6.25 中,與 proc 系統(tǒng)的交互是通過 create_proc_entry 函數(shù)實現(xiàn)的,而這個實現(xiàn)在內(nèi)核版本 4.12.5 中已經(jīng)不存在了。 

因此,需要對該實現(xiàn)進行輕微的重寫,最終版本如下:

/******************************************************************************
 * /proc interface
 ******************************************************************************/

static int xr16_get_status(struct seq_file *m, void *v)
{
	struct uart_name_uart *pp;
	unsigned long f;
	u64 tmp;
	int i, xmax = ARRAY_SIZE(pp->in_irq);

	seq_printf(m, "UART NAME ports stat:\n");

	for (i = 0; i < UART_NAME_MAXPORTS; i++) {
		pp = &uart_name_16_ports[i];
		if (!pp->used)
			continue;

		local_irq_save(f);
		tmp = ktime_to_us(ktime_sub(ktime_get(), pp->ktm_last));
		do_div(tmp, USEC_PER_SEC);
		local_irq_restore(f);
	}

	return 0;
}

static int xr16_proc_open(struct inode *inode, struct file *file)
{
	return single_open(file, uart_name_get_status, NULL);
}

static const struct file_operations uart_name_proc_fops = {
	.owner = THIS_MODULE,
	.open = uart_name_proc_open,
	.read = seq_read,
	.llseek = seq_lseek,
	.release = single_release,
}

總而言之,驅(qū)動程序移植可以按照以下步驟完成: 

  • 1. 將舊版驅(qū)動程序的源代碼復(fù)制到新的 Linux 內(nèi)核;
  • 2. 為 Kconfig 和 Makefile 添加描述;
  • 3. 使用 busybox 將驅(qū)動程序集成到內(nèi)核構(gòu)建中(或直接編輯 .config 文件);
  • 4. 修復(fù)所有構(gòu)建錯誤,直到內(nèi)核構(gòu)建成功。 

總結(jié)

至此,我們介紹了將設(shè)備驅(qū)動程序移植到較新 Linux 內(nèi)核的基礎(chǔ)知識,以及您可能遇到的問題。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

昆明市| SHOW| 江油市| 临沂市| 澄城县| 运城市| 厦门市| 金山区| 张北县| 岑巩县| 安康市| 元江| 曲沃县| 拜泉县| 通许县| 襄城县| 沅江市| 霍山县| 合水县| 改则县| 毕节市| 新龙县| 丹阳市| 绥江县| 米易县| 固安县| 姜堰市| 昆明市| 盘山县| 阿勒泰市| 石家庄市| 增城市| 南安市| 水富县| 莫力| 兰州市| 和顺县| 城口县| 丰原市| 古丈县| 永平县|