我正在开发一个用于外部UART芯片的uart设备驱动程序,该芯片与freescale IMX SOC接口(存储器与地址和数据线映射)。
到目前为止,我使用的是主数字4 (TTY_MAJOR),这是由8250芯片使用的,因为我的系统中没有8250芯片,从数字也是8250使用的相同数字。
请让我知道这个专业编号分配是否正确?
如果这是错误的,请告诉我如何为这个驱动程序分配主号码。
我在linux 3.2内核上工作,我在linux的串行核心子风格下开发这个驱动程序。使用uart_register_driver接口注册uart设备,使用platform_driver_probe接口注册平台驱动。
发布于 2014-12-30 03:31:09
不鼓励静态分配字符设备主/次编号。为了向后兼容,我们保留了静态分配方案,但现在您应该将动态分配与alloc_chrdev_region函数一起使用:
alloc_chrdev_region(&device_node, base_major_number, device_count, device_name);此函数允许内核在加载模块时为您选择一个空闲的主编号,而不是您必须选择一个编译时常量主编号。
参数:
&device_node设备节点
base_major_number的地址您请求的最小主机号。内核将查找一个大于或等于此数字的空闲主设备号,并将其分配给您的设备。只需传递0即可为内核提供最大的flexibility.
device_count您的驱动程序正在注册的设备数量-这是您正在注册的次要编号的数量( requesting.
device_namedevice的名称
在后面的驱动程序中,您可以使用MAJOR()和MINOR()宏来提取设备号:
#define DEVNAME "MY_DEV"
#define DEVCOUNT 1
/* within __init routine, assuming you have a static device_node declared
* elsewhere in your driver
*/
int major_num;
int minor_num;
int alloc_status;
status = alloc_chrdev_region(&device_node, 0, DEVCOUNT, DEVNAME);
if (status){
printk(KERN_ERR "Registering %s driver failed with code %d.\n", DEVNAME, status);
/*go perform cleanup for failed major allocation*/
}
printk(KERN_INFO "Allocated %d device(s) at major %d, minor %d.\n", DEVCOUNT, MAJOR(device_node), MINOR(device_node));我认为对于连接到您的系统上的UART设备,如果您出于某种原因需要静态分配,那么选择主编号4是正确的,但动态分配是首选方法。
https://stackoverflow.com/questions/27605091
复制相似问题