我正在为外部uart芯片接口(带有地址和数据线的存储器)开发一个UART设备驱动程序到freescale IMX SOC。
截至目前,我正在使用8250芯片使用的主要编号4(TTY_MAJOR),因为我的系统中没有8250芯片,而且8250使用的是次要编号。
请告诉我这个主要号码是否正确?
如果这是错误的,请告诉我如何为此驱动程序分配主号码。
我正在使用linux 3.2内核,我正在开发linux下的串行核心substysem下的这个驱动程序。 使用api uart_register_driver注册uart设备和platform_driver_probe api来注册平台驱动程序。
答案 0 :(得分:0)
不鼓励对字符设备主要/次要号码进行静态分配。维护静态分配方案是为了向后兼容,但是现在你应该使用alloc_chrdev_region函数进行动态分配:
alloc_chrdev_region(&device_node, base_major_number, device_count, device_name);
此函数允许内核在加载模块时为您选择一个空闲主编号,而不必选择编译时常数主编号。
参数:
&device_node
设备节点的地址
base_major_number
您要求的最低主号码。内核将查找大于或等于此数字的免费主设备号并将其分配给您的设备。只需通过0
即可为内核提供最大的灵活性。
device_count
您的驱动程序正在注册的设备数量 - 这是您要求的次要数量。
device_name
您的设备名称
稍后在您的驱动程序中,您可以使用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的选择是正确的,但动态分配是首选方法