//if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ONE)){printk(\ snsled_turn_on(); break; case SNSLED_IO_OFF: printk(KERN_ALERT \); //if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)){printk(\ snsled_turn_off(); break; case SNSLED_IOW_PWM: printk(KERN_ALERT \arg=%d.\\n\, arg); //retval = __get_user(g_snsled_ptr->r1, (int __user *)arg); snsled_set_pwm((int __user *)arg); break; case SNSLED_IOR_PWM: #if 0 retval = __put_user(g_snsled_ptr->r1, (int __user *)arg); printk(KERN_ALERT \, g_snsled_ptr->r1); #endif printk(KERN_ALERT \configured yet.\\n\); break; default: printk(KERN_ALERT \ioctl:you got the wrong command.\\n\); break; } return retval; } int snsled_open(struct inode *inode, struct file *filp) { printk(KERN_ALERT \); #if 0
if(mt_set_gpio_mode(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_GPIO_MODE)){printk(\);} if(mt_set_gpio_dir(SNS_LED_CONTROL_LINE,GPIO_DIR_OUT)){printk(\set gpio dir failed!! \\n\);} if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ONE)){printk(\set gpio failed!! \\n\);} #endif return 0; } int snsled_release(struct inode *inode, struct file *filp) { printk(KERN_ALERT \); #if 0 if(mt_set_gpio_mode(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_GPIO_MODE)){printk(\);} if(mt_set_gpio_dir(SNS_LED_CONTROL_LINE,GPIO_DIR_OUT)){printk(\set gpio dir failed!! \\n\);} if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)){printk(\set gpio failed!! \\n\);} #endif return 0; } int snsled_turn_on(void) { printk(KERN_ALERT \); if(mt_set_gpio_mode(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_PWM_MODE)){printk(\);} if(mt_set_gpio_dir(SNS_LED_CONTROL_LINE,GPIO_DIR_OUT)){printk(\set gpio dir failed!! \\n\);} if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)){printk(\set gpio failed!! \\n\);} return 0; } int snsled_turn_off(void) {
printk(KERN_ALERT \); if(mt_set_gpio_mode(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_GPIO_MODE)){printk(\);} if(mt_set_gpio_dir(SNS_LED_CONTROL_LINE,GPIO_DIR_OUT)){printk(\set gpio dir failed!! \\n\);} if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)){printk(\set gpio failed!! \\n\);} return 0; } //for old mode /** struct _PWM_OLDMODE_REGS { U16 IDLE_VALUE; //0 U16 GUARD_VALUE; //0 U16 GDURATION; //~ U16 WAVE_NUM; //0 U16 DATA_WIDTH; //high level, 13bits, 0~8191 U16 THRESH; //t }PWM_MODE_OLD_REGS; **/ int snsled_set_pwm(int arg) { struct pwm_spec_config pwm_setting; pwm_setting.pwm_no = PWM1; printk(KERN_ALERT \); pwm_setting.mode = PWM_MODE_OLD; pwm_setting.clk_div = CLK_DIV16;//CLK_DIV128; pwm_setting.clk_src = PWM_CLK_OLD_MODE_32K; pwm_setting.PWM_MODE_OLD_REGS.IDLE_VALUE = 0; pwm_setting.PWM_MODE_OLD_REGS.GUARD_VALUE = 0; pwm_setting.PWM_MODE_OLD_REGS.GDURATION = 8100; pwm_setting.PWM_MODE_OLD_REGS.WAVE_NUM = 0; pwm_setting.PWM_MODE_OLD_REGS.DATA_WIDTH = 8100; pwm_setting.PWM_MODE_OLD_REGS.THRESH = 8100; pwm_set_spec_config(&pwm_setting); printk(KERN_ALERT \); return 0;
} //alloc device major static int vircdex_alloc_major(void) { dev_t devt = 0; int result = 0; result = alloc_chrdev_region(&devt, g_snsled_minor, SNSLED_NUM, SNSLED_NODE_NAME); g_snsled_major = MAJOR(devt); return result; } static int snsled_release_major(void) { dev_t devt = MKDEV(g_snsled_major, g_snsled_minor); unregister_chrdev_region(devt, 1); return 0; } static int snsled_setup_dev(struct snsled_cntx *dev) { int err, devno = MKDEV(g_snsled_major, g_snsled_minor); cdev_init(&(dev->cdev), &g_snsled_fops); dev->cdev.owner = THIS_MODULE; err = cdev_add(&dev->cdev, devno, 1); if(err){ return err; } //init_MUTEX(&(dev->sem)); sema_init(&(dev->sem), 1); return 0; } static int snsled_unsetup_dev(struct snsled_cntx *dev) { cdev_del(&(dev->cdev)); return 0; } static int snsled_create_devfiles(dev_t devt) {//, const struct device_attribute *attr) {
int err = -1; struct device *dev = NULL; g_snsled_class = class_create(THIS_MODULE, SNSLED_CLASS_NAME); if(IS_ERR(g_snsled_class)) { err = PTR_ERR(g_snsled_class); printk(KERN_ALERT \); goto CLASS_CREATE_ERR; } dev = device_create(g_snsled_class, NULL, devt, NULL, SNSLED_DEVICE_NAME); //dev = device_create(hello_class, NULL, dev, \HELLO_DEVICE_FILE_NAME); //device_create( my_class, NULL, MKDEV(hello_major, 0), \0 ); //dev = device_create(g_snsled_class, NULL, MKDEV(MYDRIVER_Major, 0), NULL, DEVICE_NAME); if(IS_ERR(dev)) { err = PTR_ERR(dev); printk(KERN_ALERT \); goto DEVICE_CREATE_ERR; } /*err = device_create_file(dev, attr); if(err < 0) { printk(KERN_ALERT\ goto DEVICE_CREATE_FILE_ERR; }*/ printk(KERN_ALERT \); //zmk@@debug return 0; DEVICE_CREATE_FILE_ERR: device_destroy(g_snsled_class, devt); DEVICE_CREATE_ERR: class_destroy(g_snsled_class); CLASS_CREATE_ERR: return err; } static int snsled_delete_devfiles(dev_t devt) { device_destroy(g_snsled_class, devt); class_destroy(g_snsled_class); //device_remove_file(dev, attr);