#用戶空間與驅動的通信手段
驅動傳參
module_param(name, type, perm)
static unsigned int int_var = 0;
module_param(int_var, uint, S_IRUGO);
insmod xxxx.ko int_var=x
module_param_array(para , type , &n_para , perm)
static int pcie_ep_vid[PCI_EP_MAX_ID_NUM];
static int pcie_ep_did[PCI_EP_MAX_ID_NUM];
static int pcie_ep_vid_num;
static int pcie_ep_did_num;
module_param_array(pcie_ep_vid, int, &pcie_ep_vid_num, S_IRUGO);
module_param_array(pcie_ep_did, int, &pcie_ep_did_num, S_IRUGO);
static int __init pcie_ep_init(void)
{
int ret;
int i;
int id_num = PCI_EP_MAX_ID_NUM;
/*printk("%s compile: %s %s\n", __FUNCTION__, __DATE__, __TIME__);*/
if (pcie_ep_vid_num > id_num || pcie_ep_did_num > id_num) {
printk("%s modules param array too long\n", __FUNCTION__);
return -EINVAL;
}
id_num = (pcie_ep_vid_num < pcie_ep_did_num) ? pcie_ep_vid_num : pcie_ep_did_num;
printk("%s modules param num %d %d\n", __FUNCTION__, pcie_ep_vid_num, pcie_ep_did_num);
for (i = 0; i < id_num; i++) {
pcie_ep_match[i].vendor = pcie_ep_vid[i];
pcie_ep_match[i].device = pcie_ep_did[i];
pcie_ep_match[i].subvendor = PCI_ANY_ID;
pcie_ep_match[i].subdevice = PCI_ANY_ID;
printk("%s match[%d] 0x%04x 0x%04x 0x%04x 0x%04x\n", __FUNCTION__,
i, pcie_ep_match[i].vendor, pcie_ep_match[i].device,
pcie_ep_match[i].subvendor, pcie_ep_match[i].subdevice);
}
if (id_num > 0) {
pcie_ep_match[i].vendor = 0;
pcie_ep_match[i].device = 0;
pcie_ep_match[i].subvendor = 0;
pcie_ep_match[i].subdevice = 0;
}
ret = pci_register_driver(&pcie_ep_driver);
if(ret)
printk("%s pci_register_driver error\n", __FUNCTION__);
return ret;
}
#sysfs使用
#debugfs使用
#proc使用