驱动开发系列 - pci驱动

一:pci驱动定义

cpp 复制代码
#include <linux/module.h> 
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/pci.h>

MODULE_LICENSE("GPL");

#define MY_VENDOR_ID 0xAAAA  //厂家ID, PCI厂家ID在全球统一分配和管理
#define MY_DEVICE_ID_NET1 0xFF01 //卡ID
#define MY_DEVICE_ID_NET2 0xFF02 //卡ID 

//驱动中支持多个卡,用此来标识每个卡的信息
enum my_asic_type {
	CHIP_MY_A0 = 0,
	CHIP_MY_B0 = 1,
	CHIP_LAST
};

//设置驱动所支持的PCI卡列表,本例子支持A0, B0两个卡
struct pci_device_id my_network_driver_pci_table[] = {
	{
		MY_VENDOR_ID, 
		MY_DEVICE_ID_NET1, 
		PCI_ANY_ID,
		PCI_ANY_ID,
		0,
		0,
		CHIP_MY_A0
	},
	{
		MY_VENDOR_ID, //factory id
		MY_DEVICE_ID_NET2,//device id
		PCI_ANY_ID,
		PCI_ANY_ID,
		0,
		0,
		CHIP_MY_B0
	},

};

//probe函数
static int my_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
	return 0;
}

//remove 函数
static void my_driver_remove(struct pci_dev *pdev)
{
	return;
}

//pci_driver 定义
struct pci_driver my_network_pci_driver = {
	.name = "myntwrk",
	.probe = my_driver_probe,
	.remove = my_driver_remove,
	.id_table = my_network_driver_pci_table,
};

static int my_network_driver_init(void)
{
	pci_register_driver(&my_network_pci_driver);
	return 0;
}

static void my_network_driver_exit(void)
{
	pci_unregister_driver(&my_network_pci_driver);
}

module_init(my_network_driver_init);
module_exit(my_network_driver_exit);




//MakeFile
obj-m := mypci.o

KERNEL_DIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd)

EXTRA_CFLAGS = -g 
ccflags-y := -O0

all:
	make -C $(KERNEL_DIR) M=$(PWD) modules 
clean:
	make -C $(KERNEL_DIR) M=$(PWD) clean

二:probe和remove实现:

三:增加DMA:

四:中断处理:

相关推荐
月亮给我抄代码2 小时前
Superpowers —— 让 AI 编程代理具备工程化开发能力
驱动开发·ai编程·codex·claude code·opencode·superpowers
Tom·Ge2 小时前
告别“猜谜式编程”!详解规范驱动开发(SDD)在企业AI开发中的最佳实践
人工智能·驱动开发
s090713619 小时前
ZYNQ7000 AXI DMA 接收中断(S2MM_introut)全解析:从硬件原理到Linux驱动开发
linux·驱动开发·dma·zynq
路溪非溪19 小时前
如何使用sysfs来排查驱动问题
linux·arm开发·驱动开发
路溪非溪1 天前
如何使用procfs来排查问题
linux·arm开发·驱动开发
青桔柠薯片1 天前
Linux 设备驱动开发环境构建与系统启动机制剖析
linux·arm开发·驱动开发·imx6ull
Clarence Liu1 天前
langchain源码研究 - deepagents设计思想学习
人工智能·驱动开发·学习·langchain
2601_949695591 天前
笔记本电脑怎么连接无线网WiFi?【2026最新完整版教程】
驱动开发·电脑
somi71 天前
ARM-驱动-03 Linux 字符设备驱动开发
linux·arm开发·驱动开发·自用
不怕犯错,就怕不做2 天前
rk3562 buildrooot编译更新的lib库push后无效问题分析
linux·驱动开发·嵌入式硬件