주요 부분
#define DRIVER_NAME "axi-radar"
#define DEVICE_NAME "axi-radar"
#define CLASS_NAME "axiRadarClass"
/* Simple example of how to receive command line parameters to your module.
Delete if you don't need them */
unsigned myint = 0xdeadbeef;
char *mystr = "default";
/* class */
static struct class* axiRadarClass = NULL;
static struct device* axiRadarDevice = NULL;
...
static int __init axi_radar_init(void)
{
printk("<1>AXI-Radar. 1\n");
printk("<1>Module parameters were (0x%08x) and \"%s\"\n", myint, mystr);
radar_base_vaddr = 0x00;
majorNumber = register_chrdev(0, DEVICE_NAME, &fops);
if (majorNumber< 0) {
printk(KERN_ALERT "axi-radar : Registering char device failed with %d\n", majorNumber);
return majorNumber;
}
printk(KERN_INFO "axi-radar : major number %d.\n", majorNumber);
axiRadarClass = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(axiRadarClass)){ // Check for error and clean up if there is
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_ALERT "axi-radar : Failed to register device class\n");
return PTR_ERR(axiRadarClass); // Correct way to return an error on a pointer
}
printk(KERN_INFO "axi-radar : device class registered correctly\n");
// Register the device driver
axiRadarDevice = device_create(axiRadarClass, NULL, MKDEV(majorNumber, 0), NULL, DEVICE_NAME);
if (IS_ERR(axiRadarDevice)){ // Clean up if there is an error
class_destroy(axiRadarClass); // Repeated code but the alternative is goto statements
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_ALERT "axi-radar : Failed to create the device\n");
return PTR_ERR(axiRadarDevice);
}
return platform_driver_register(&axi_radar_driver);
}
static void __exit axi_radar_exit(void)
{
device_destroy(axiRadarClass, MKDEV(majorNumber, 0)); // remove the device
class_unregister(axiRadarClass); // unregister the device class
class_destroy(axiRadarClass); // remove the device class
unregister_chrdev(majorNumber, DEVICE_NAME); // unregister the major number
platform_driver_unregister(&axi_radar_driver);
printk(KERN_ALERT "axi-radar : exit.\n");
}