asturel

Untitled

Mar 2nd, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.37 KB | None | 0 0
  1. /*****************************************************************************
  2. * Copyright (C) 2010, Huawei Tech. Co., Ltd.
  3. * ALL RIGHTS RESERVED
  4. * FileName: s70_ledctl.c
  5. * Version: 1.0
  6. * Description: Led ctrl driver.
  7. *
  8. * History:
  9. * 1. 2010-04-02,z00101756 Create this file.
  10. ******************************************************************************/
  11.  
  12.  
  13.  
  14. /*****************************************************************************/
  15. /* 本文件需要包含的其他头文件依赖 */
  16. /*****************************************************************************/
  17. /*标准头文件*/
  18. #include <linux/init.h>
  19. #include <linux/module.h>
  20. #include <linux/fs.h>
  21. #include <linux/jiffies.h>
  22. #include <linux/timer.h>
  23. #include <linux/miscdevice.h>
  24. #include <linux/delay.h>
  25. #include <linux/kernel.h>
  26. #include <linux/err.h>
  27. #include <linux/hrtimer.h>
  28. #include <mach/gpio.h>
  29. #include <linux/uaccess.h>
  30.  
  31. /*自定义头文件*/
  32. #include "incident_led.h"
  33.  
  34. #define LED_GPIO_INCIDENT_LED 99
  35.  
  36. #ifdef __cplusplus
  37. #if __cplusplus
  38. extern "C" {
  39. #endif /* __cpluscplus */
  40. #endif /* __cpluscplus */
  41.  
  42. static int DRV_LedDevIoctl(struct inode *inode, struct file *file,
  43. unsigned int cmd, unsigned long arg);
  44.  
  45. static int DRV_LedDevOpen(struct inode *inode, struct file *file);
  46.  
  47. static int DRV_LedDevClose(struct inode *inode, struct file *file);
  48.  
  49.  
  50. static void LED_TimerHandler(unsigned long data);
  51.  
  52. static DEFINE_TIMER(gLED_Timer, LED_TimerHandler, 0, 0);
  53.  
  54.  
  55. static DECLARE_MUTEX(mLedSem);
  56.  
  57. static int m_status = 0;
  58.  
  59. static BSP_LED_S_CTRL gsLedParam;
  60.  
  61. static ssize_t Incident_led_attr_store(struct kobject *kobj, struct kobj_attribute *attr,
  62. char *buf)
  63. {
  64. if(0 == strncmp(buf,"0",1))
  65. {
  66. gpio_set_value(LED_GPIO_INCIDENT_LED, 0);
  67. }
  68. else
  69. {
  70. gpio_set_value(LED_GPIO_INCIDENT_LED, 1);
  71. }
  72.  
  73. return 0;
  74. }
  75.  
  76. static struct kobj_attribute Incident_led_attribute =
  77. __ATTR(light, 0666, NULL, Incident_led_attr_store);
  78.  
  79. static struct attribute* Incident_led_attributes[] =
  80. {
  81. &Incident_led_attribute.attr,
  82. NULL
  83. };
  84.  
  85. static struct attribute_group Incident_led_defattr_group =
  86. {
  87. .attrs = Incident_led_attributes,
  88. };
  89. static void Led_Ctrl_func(struct work_struct *work)
  90. {
  91. if (m_status)
  92. {
  93. gpio_set_value(LED_GPIO_INCIDENT_LED, 1);
  94. mod_timer(&gLED_Timer, jiffies + gsLedParam.usOnTime * HZ / 1000);
  95. }
  96. else
  97. {
  98. gpio_set_value(LED_GPIO_INCIDENT_LED, 0);
  99. mod_timer(&gLED_Timer, jiffies + gsLedParam.usOffTime * HZ / 1000);
  100. }
  101.  
  102. m_status = ~m_status;
  103. }
  104.  
  105. static DECLARE_DELAYED_WORK(led_event, Led_Ctrl_func);
  106. static void LED_TimerHandler(unsigned long data)
  107. {
  108. schedule_delayed_work(&led_event, msecs_to_jiffies(1));
  109. return;
  110. }
  111.  
  112.  
  113. struct file_operations led_fops =
  114. {
  115. .ioctl = DRV_LedDevIoctl,
  116. .open = DRV_LedDevOpen,
  117. .release = DRV_LedDevClose
  118. };
  119.  
  120. static struct miscdevice led_dev = {
  121. MISC_DYNAMIC_MINOR,
  122. BSP_LED_DEVICE_NAME,
  123. &led_fops,
  124. };
  125.  
  126. /************************************************************************
  127. * 函数名称:DRV_LedDevInit
  128. * 功能描述:装载LED驱动模块
  129. * 输入参数:无
  130. * 输出参数:无
  131. * 返 回 值:无
  132. * 影 响:
  133. * 其它说明:
  134. * 作 者:
  135. * 修改日期 版本号 修改人 修改内容
  136. * -----------------------------------------------
  137. * 200X/XX/XX VX.X XXX XXXX
  138. ************************************************************************/
  139. static int __init DRV_LedDevInit(void)
  140. {
  141. int ret = 0;
  142. struct kobject *kobj = NULL;
  143.  
  144. ret = gpio_request(LED_GPIO_INCIDENT_LED, " INCIDENT_LED_GPIO RESET Enable");
  145. if (ret)
  146. {
  147. printk("gpio_request failed.\n");
  148. return -1;
  149. }
  150.  
  151. ret = gpio_tlmm_config(GPIO_CFG(LED_GPIO_INCIDENT_LED, 0, GPIO_OUTPUT, GPIO_PULL_DOWN, GPIO_2MA), GPIO_ENABLE);
  152. if(ret < 0)
  153. {
  154. printk("gpio_tlmm_config failed.\n");
  155. gpio_free(LED_GPIO_INCIDENT_LED);
  156. return -1;
  157. }
  158.  
  159. gpio_set_value(LED_GPIO_INCIDENT_LED, 0);
  160.  
  161. ret = misc_register(&led_dev);
  162. if (ret)
  163. {
  164. printk("register device led failed.\n");
  165. return ret;
  166. }
  167.  
  168. kobj = kobject_create_and_add("incident_led", NULL);
  169. if (kobj == NULL) {
  170. return -1;
  171. }
  172. if (sysfs_create_group(kobj, &Incident_led_defattr_group)) {
  173. kobject_put(kobj);
  174. return -1;
  175. }
  176.  
  177. printk("S70 led driver init.\n");
  178. return 0;
  179. }
  180.  
  181.  
  182. /************************************************************************
  183. * 函数名称:DRV_LedDevFree
  184. * 功能描述:卸载LED驱动模块
  185. * 输入参数:无
  186. * 输出参数:无
  187. * 返 回 值:无
  188. * 影 响:
  189. * 其它说明:
  190. * 作 者:
  191. * 修改日期 版本号 修改人 修改内容
  192. * -----------------------------------------------
  193. * 200X/XX/XX VX.X XXX XXXX
  194. ************************************************************************/
  195. static void __exit DRV_LedDevFree(void)
  196. {
  197. gpio_set_value(LED_GPIO_INCIDENT_LED, 0);
  198. gpio_free(LED_GPIO_INCIDENT_LED);
  199. del_timer(&gLED_Timer);
  200. misc_deregister(&led_dev);
  201. return;
  202. }
  203.  
  204.  
  205. /************************************************************************
  206. * 函数名称:DRV_LedDevOpen
  207. * 功能描述:打开LED设备
  208. * 输入参数:略
  209. * 输出参数:无
  210. * 返 回 值:成功返回0,失败返回-EBUSY,表示设备忙
  211. * 影 响:
  212. * 其它说明:
  213. * 作 者:
  214. * 修改日期 版本号 修改人 修改内容
  215. * -----------------------------------------------
  216. * 200X/XX/XX VX.X XXX XXXX
  217. ************************************************************************/
  218. static int DRV_LedDevOpen(struct inode *inode, struct file *file)
  219. {
  220.  
  221. down(&mLedSem);
  222. return 0;
  223. }
  224.  
  225. /************************************************************************
  226. * 函数名称:DRV_LedDevClose
  227. * 功能描述:关闭LED设备
  228. * 输入参数:略
  229. * 输出参数:无
  230. * 返 回 值:返回0
  231. * 影 响:
  232. * 其它说明:
  233. * 作 者:
  234. * 修改日期 版本号 修改人 修改内容
  235. * -----------------------------------------------
  236. * 200X/XX/XX VX.X XXX XXXX
  237. ************************************************************************/
  238. static int DRV_LedDevClose(struct inode *inode, struct file *file)
  239. {
  240. up(&mLedSem);
  241. return 0;
  242. }
  243.  
  244. /************************************************************************
  245. * 函数名称:DRV_LedDevIoctl
  246. * 功能描述:控制LED设备
  247. * 输入参数:cmd:操作命令,包括亮、灭、闪烁
  248. arg:命令参数,忽略
  249. * 输出参数:无
  250. * 返 回 值:返回0
  251. * 影 响:
  252. * 其它说明:
  253. * 作 者:
  254. * 修改日期 版本号 修改人 修改内容
  255. * -----------------------------------------------
  256. * 200X/XX/XX VX.X XXX XXXX
  257. ************************************************************************/
  258. static int DRV_LedDevIoctl(struct inode *inode, struct file *file,
  259. unsigned int cmd, unsigned long arg)
  260. {
  261. //BSP_LED_S_CTRL sPara;
  262. unsigned int ulRet;
  263.  
  264. switch(cmd)
  265. {
  266. case BSP_LED_E_ON:
  267. del_timer_sync(&gLED_Timer);
  268. gpio_set_value(LED_GPIO_INCIDENT_LED, 1);
  269. break;
  270. case BSP_LED_E_OFF:
  271. del_timer(&gLED_Timer);
  272. gpio_set_value(LED_GPIO_INCIDENT_LED, 0);
  273. break;
  274. case BSP_LED_E_FLASH:
  275. ulRet = copy_from_user((void *)&gsLedParam, (void __user *)arg, sizeof(gsLedParam));
  276. if(0 != ulRet)
  277. {
  278. return -1;
  279. }
  280. mod_timer(&gLED_Timer, jiffies + 2);
  281. break;
  282. default:
  283. printk("Error Ioctl operation.\r\n");
  284. return -1;
  285. }
  286. return 0;
  287. }
  288.  
  289. module_init(DRV_LedDevInit);
  290. module_exit(DRV_LedDevFree);
  291.  
  292. MODULE_AUTHOR("HUAWEI Ltd");
  293. MODULE_DESCRIPTION("HUAWEI S70 Led Driver");
  294. MODULE_LICENSE("GPL");
  295.  
  296.  
  297. #ifdef __cplusplus
  298. #if __cplusplus
  299. }
  300. #endif /* __cpluscplus */
  301. #endif /* __cpluscplus */
Advertisement
Add Comment
Please, Sign In to add comment