第一步:
完成相關驅動的編寫,這裡最開始我挺猶豫的,我驅動的資料如何上報??通過ioctl??我不想那麼麻煩,最好在網上找到一個關於用input機制上報對應的值
001.#include <linux/platform_device.h>
002. 
003.#include <linux/input-polldev.h>
004. 
005.#include <linux/kernel.h>
006. 
007.#include <linux/module.h>
008. 
009.#include <mach/adc.h>
010. 
011.//#include <linux/saradc.h>
012. 
013. 
014. 
015.#define POLL_INTERVAL    2000     /* poll for input every 2s*/
016. 
017.#define LUX_LEVEL    4                    /* 0~4 report 5 levels*/
018. 
019. 
020. 
021.static struct platform_device *pdev;
022. 
023.static struct input_dev *idev;
024. 
025.static struct input_polled_dev *light_sensor_idev;
026. 
027. 
028. 
029. 
030. 
031. 
032. 
033.static const int sAdcValues[LUX_LEVEL] = {
034. 
035.200,
036. 
037.1000,
038. 
039.1800,
040. 
041.3400,
042. 
043.};
044. 
045. 
046. 
047.struct light_sensor_info {
048. 
049.int lux_level;
050. 
051.int suspend;
052. 
053.};
054. 
055.static struct light_sensor_info ls_info;
056. 
057. 
058. 
059./* Sysfs Files */
060. 
061.static ssize_t light_sensor_lux_level_show(struct device *dev,
062. 
063.struct device_attribute *attr, char *buf)
064. 
065.{
066. 
067.return sprintf(buf, "(%d)\n",get_s3c_adc_convert(3));
068. 
069.}
070. 
071. 
072. 
073.static DEVICE_ATTR(lux_level, 0444, light_sensor_lux_level_show, NULL);
074. 
075. 
076. 
077.static struct attribute *light_sensor_attributes[] = {
078. 
079.&dev_attr_lux_level.attr,
080. 
081.NULL,
082. 
083.};
084. 
085. 
086. 
087.static struct attribute_group light_sensor_attribute_group = {
088. 
089..attrs = light_sensor_attributes,
090. 
091.};
092. 
093. 
094. 
095. 
096. 
097./* Device model stuff */
098. 
099.static int light_sensor_probe(struct platform_device *dev)
100. 
101.{
102. 
103.printk(KERN_INFO "light_sensor: device successfully initialized.\n");
104. 
105.return 0;
106. 
107.}
108. 
109. 
110. 
111.#ifdef CONFIG_PM
112. 
113.static int light_sensor_suspend(struct platform_device *dev, pm_message_t state)
114. 
115.{
116. 
117.ls_info.suspend = 1;
118. 
119.return 0;
120. 
121.}
122. 
123. 
124. 
125.static int light_sensor_resume(struct platform_device *dev)
126. 
127.{
128. 
129.ls_info.suspend = 0;
130. 
131.return 0;
132. 
133.}
134. 
135.#else
136. 
137.#define light_sensor_suspend NULL
138. 
139.#define light_sensor_resume NULL
140. 
141.#endif
142. 
143. 
144. 
145.static struct platform_driver light_sensor_driver = {
146. 
147..probe = light_sensor_probe,
148. 
149..resume = light_sensor_resume,
150. 
151..suspend = light_sensor_suspend,
152. 
153..driver    = {
154. 
155..name = "light_sensor",
156. 
157..owner = THIS_MODULE,
158. 
159.},
160. 
161.};
162. 
163. 
164. 
165.static void light_sensor_dev_poll(struct input_polled_dev *dev)
166. 
167.{
168. 
169.int adc_val, i;
170. 
171. 
172. 
173.adc_val = get_s3c_adc_convert(3);
174. 
175.for(i = 0; i < LUX_LEVEL; i++) {
176. 
177.if(adc_val < sAdcValues[i])
178. 
179.break;
180. 
181.}
182. 
183. 
184. 
185. 
186. 
187. 
188.if(ls_info.lux_level != i) {
189. 
190.ls_info.lux_level = i;   
191. 
192.input_report_abs(idev, ABS_X, ls_info.lux_level);
193. 
194.input_sync(idev);
195. 
196. 
197.}   
198. 
199. 
200. 
201.}
202. 
203. 
204. 
205./* Module stuff */
206. 
207.static int __init light_sensor_init(void)
208. 
209.{
210. 
211. 
212. 
213.int ret;
214. 
215. 
216. 
217.ret = platform_driver_register(&light_sensor_driver);
218. 
219.if (ret)
220. 
221.goto out;
222. 
223. 
224. 
225.pdev = platform_device_register_simple("light_sensor", -1, NULL, 0);
226. 
227.if (IS_ERR(pdev)) {
228. 
229.ret = PTR_ERR(pdev);
230. 
231.goto out_driver;
232. 
233.}
234. 
235. 
236. 
237.ret = sysfs_create_group(&pdev->dev.kobj, &light_sensor_attribute_group);
238. 
239.if (ret)
240. 
241.goto out_device;
242. 
243. 
244. 
245.light_sensor_idev = input_allocate_polled_device();
246. 
247.if (!light_sensor_idev) {
248. 
249.ret = -ENOMEM;
250. 
251.goto out_group;
252. 
253.}
254. 
255. 
256. 
257.light_sensor_idev->poll = light_sensor_dev_poll;//在hal层成功打开的时候会开始轮询
258. 
259.light_sensor_idev->poll_interval = POLL_INTERVAL;
260. 
261. 
262. 
263./* initialize the input class */
264. 
265.idev = light_sensor_idev->input;
266. 
267.idev->name = "light_sensor";//这个名字到时和你hal写的name必须一致
268. 
269.idev->phys = "light_sensor/input0";
270. 
271.idev->id.bustype = BUS_ISA;
272. 
273.idev->dev.parent = &pdev->dev;
274. 
275.idev->evbit[0] = BIT_MASK(EV_ABS);
276. 
277.input_set_abs_params(idev, ABS_X,
278. 
279.0, LUX_LEVEL, 01);
280. 
281. 
282. 
283.ret = input_register_polled_device(light_sensor_idev);
284. 
285.if (ret)
286. 
287.goto out_idev;
288. 
289. 
290. 
291. 
292. 
293.printk(KERN_INFO "huabinbin test light_sensor: driver successfully loaded.\n");
294. 
295.return 0;
296. 
297. 
298. 
299.out_idev:
300. 
301.input_free_polled_device(light_sensor_idev);
302. 
303.out_group:
304. 
305.sysfs_remove_group(&pdev->dev.kobj, &light_sensor_attribute_group);
306. 
307.out_device:
308. 
309.platform_device_unregister(pdev);
310. 
311.out_driver:
312. 
313.platform_driver_unregister(&light_sensor_driver);
314. 
315.out:
316. 
317.printk(KERN_WARNING "light_sensor: driver init failed (ret=%d)!\n", ret);
318. 
319.return ret;
320. 
321.}
322. 
323. 
324. 
325.static void __exit light_sensor_exit(void)
326. 
327.{
328. 
329.input_unregister_polled_device(light_sensor_idev);
330. 
331.input_free_polled_device(light_sensor_idev);
332. 
333.sysfs_remove_group(&pdev->dev.kobj, &light_sensor_attribute_group);
334. 
335.platform_device_unregister(pdev);
336. 
337.platform_driver_unregister(&light_sensor_driver);   
338. 
339. 
340. 
341.printk(KERN_INFO "light_sensor: driver unloaded.\n");
342. 
343.}
344. 
345. 
346. 
347.module_init(light_sensor_init);
348. 
349.module_exit(light_sensor_exit);

 

 

FROM:http://www.it165.net/pro/html/201207/3152.html

創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()