2 * Microcontroller Message Bus
4 * Copyright (c) 2009 Michael Buesch <mb@bu3sch.de>
6 * Licensed under the GNU/GPL. See COPYING for details.
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
13 #include <linux/miscdevice.h>
15 #include <linux/spi/spi.h>
16 #include <linux/spi/spi_gpio.h>
17 #include <linux/spi/spi_bitbang.h>
18 #include <linux/gpio.h>
19 #include <linux/gfp.h>
20 #include <linux/delay.h>
21 #include <linux/crc16.h>
29 MODULE_LICENSE("GPL");
30 MODULE_DESCRIPTION("Microcontroller Message Bus");
31 MODULE_AUTHOR("Michael Buesch");
37 unsigned int msg_delay_ms
;
38 unsigned int gpio_reset
;
41 /* Misc character device driver */
42 struct miscdevice mdev
;
43 struct file_operations mdev_fops
;
46 struct spi_device
*sdev
;
49 struct spi_gpio_platform_data spi_gpio_pdata
;
50 struct platform_device spi_gpio_pdev
;
53 struct ucmb_message_hdr
{
54 __le16 magic
; /* UCMB_MAGIC */
55 __le16 len
; /* Payload length (excluding header and footer) */
56 } __attribute__((packed
));
58 struct ucmb_message_footer
{
59 __le16 crc
; /* CRC of the header + payload. */
60 } __attribute__((packed
));
63 __le16 magic
; /* UCMB_MAGIC */
64 __le16 code
; /* enum ucmb_status_code */
65 } __attribute__((packed
));
67 #define UCMB_MAGIC 0x1337
69 enum ucmb_status_code
{
71 UCMB_STAT_EPROTO
, /* Protocol format error */
72 UCMB_STAT_ENOMEM
, /* Out of memory */
73 UCMB_STAT_E2BIG
, /* Message too big */
74 UCMB_STAT_ECRC
, /* CRC error */
78 static int ucmb_spi_busnum_count
= 1337;
81 static struct ucmb_platform_data ucmb_list
[] = {
82 { //FIXME don't define it here.
84 .gpio_cs
= SPI_GPIO_NO_CHIPSELECT
,
91 .max_speed_hz
= 128000, /* Hz */
92 .msg_delay_ms
= 1, /* mS */
97 static int __devinit
ucmb_spi_probe(struct spi_device
*sdev
)
102 static int __devexit
ucmb_spi_remove(struct spi_device
*sdev
)
107 static struct spi_driver ucmb_spi_driver
= {
110 .bus
= &spi_bus_type
,
111 .owner
= THIS_MODULE
,
113 .probe
= ucmb_spi_probe
,
114 .remove
= __devexit_p(ucmb_spi_remove
),
117 static void ucmb_toggle_reset_line(struct ucmb
*ucmb
, bool active
)
119 if (ucmb
->reset_activelow
)
121 gpio_set_value(ucmb
->gpio_reset
, active
);
124 static int ucmb_reset_microcontroller(struct ucmb
*ucmb
)
126 if (ucmb
->gpio_reset
== UCMB_NO_RESET
)
129 ucmb_toggle_reset_line(ucmb
, 1);
131 ucmb_toggle_reset_line(ucmb
, 0);
137 static int ucmb_status_code_to_errno(enum ucmb_status_code code
)
142 case UCMB_STAT_EPROTO
:
144 case UCMB_STAT_ENOMEM
:
146 case UCMB_STAT_E2BIG
:
154 static inline struct ucmb
* filp_to_ucmb(struct file
*filp
)
156 return container_of(filp
->f_op
, struct ucmb
, mdev_fops
);
159 static int ucmb_ioctl(struct inode
*inode
, struct file
*filp
,
160 unsigned int cmd
, unsigned long arg
)
162 struct ucmb
*ucmb
= filp_to_ucmb(filp
);
165 mutex_lock(&ucmb
->mutex
);
167 case UCMB_IOCTL_RESETUC
:
168 ret
= ucmb_reset_microcontroller(ucmb
);
173 mutex_unlock(&ucmb
->mutex
);
178 static ssize_t
ucmb_read(struct file
*filp
, char __user
*user_buf
,
179 size_t size
, loff_t
*offp
)
181 struct ucmb
*ucmb
= filp_to_ucmb(filp
);
184 struct ucmb_message_hdr hdr
;
185 struct ucmb_message_footer footer
;
186 struct ucmb_status status
= { .magic
= cpu_to_le16(UCMB_MAGIC
), };
189 mutex_lock(&ucmb
->mutex
);
191 size
= min_t(size_t, size
, PAGE_SIZE
);
194 buf
= (char *)__get_free_page(GFP_KERNEL
);
198 err
= spi_read(ucmb
->sdev
, (u8
*)&hdr
, sizeof(hdr
));
202 printk(KERN_DEBUG PFX
"Received message header 0x%04X 0x%04X\n",
203 le16_to_cpu(hdr
.magic
), le16_to_cpu(hdr
.len
));
206 if (hdr
.magic
!= cpu_to_le16(UCMB_MAGIC
))
209 if (size
< le16_to_cpu(hdr
.len
))
211 size
= le16_to_cpu(hdr
.len
);
212 err
= spi_read(ucmb
->sdev
, buf
, size
);
215 err
= spi_read(ucmb
->sdev
, (u8
*)&footer
, sizeof(footer
));
219 crc
= crc16(crc
, (u8
*)&hdr
, sizeof(hdr
));
220 crc
= crc16(crc
, buf
, size
);
222 if (crc
!= le16_to_cpu(footer
.crc
)) {
224 status
.code
= UCMB_STAT_ECRC
;
225 goto out_send_status
;
228 if (copy_to_user(user_buf
, buf
, size
)) {
230 status
.code
= UCMB_STAT_ENOMEM
;
231 goto out_send_status
;
234 status
.code
= UCMB_STAT_OK
;
238 res
= spi_write(ucmb
->sdev
, (u8
*)&status
, sizeof(status
));
242 free_page((unsigned long)buf
);
244 mutex_unlock(&ucmb
->mutex
);
246 return err
? err
: size
;
249 static ssize_t
ucmb_write(struct file
*filp
, const char __user
*user_buf
,
250 size_t size
, loff_t
*offp
)
252 struct ucmb
*ucmb
= filp_to_ucmb(filp
);
255 struct ucmb_message_hdr hdr
= { .magic
= cpu_to_le16(UCMB_MAGIC
), };
256 struct ucmb_message_footer footer
= { .crc
= 0xFFFF, };
257 struct ucmb_status status
;
258 struct spi_transfer spi_hdr_xfer
;
259 struct spi_transfer spi_footer_xfer
;
260 struct spi_transfer spi_data_xfer
;
261 struct spi_message spi_msg
;
263 mutex_lock(&ucmb
->mutex
);
266 buf
= (char *)__get_free_page(GFP_KERNEL
);
270 size
= min_t(size_t, PAGE_SIZE
, size
);
272 if (copy_from_user(buf
, user_buf
, size
))
274 hdr
.len
= cpu_to_le16(size
);
276 footer
.crc
= crc16(footer
.crc
, (u8
*)&hdr
, sizeof(hdr
));
277 footer
.crc
= crc16(footer
.crc
, buf
, size
);
278 footer
.crc
^= 0xFFFF;
280 spi_message_init(&spi_msg
);
282 memset(&spi_hdr_xfer
, 0, sizeof(spi_hdr_xfer
));
283 spi_hdr_xfer
.tx_buf
= &hdr
;
284 spi_hdr_xfer
.len
= sizeof(hdr
);
285 spi_message_add_tail(&spi_hdr_xfer
, &spi_msg
);
287 memset(&spi_data_xfer
, 0, sizeof(spi_data_xfer
));
288 spi_data_xfer
.tx_buf
= buf
;
289 spi_data_xfer
.len
= size
;
290 spi_message_add_tail(&spi_data_xfer
, &spi_msg
);
292 memset(&spi_footer_xfer
, 0, sizeof(spi_footer_xfer
));
293 spi_footer_xfer
.tx_buf
= &footer
;
294 spi_footer_xfer
.len
= sizeof(footer
);
295 spi_message_add_tail(&spi_footer_xfer
, &spi_msg
);
297 /* Send the message, including header. */
298 err
= spi_sync(ucmb
->sdev
, &spi_msg
);
302 /* The microcontroller deserves some time to process the message. */
303 if (ucmb
->msg_delay_ms
)
304 msleep(ucmb
->msg_delay_ms
);
306 /* Get the status code. */
307 err
= spi_read(ucmb
->sdev
, (u8
*)&status
, sizeof(status
));
311 printk(KERN_DEBUG PFX
"Sent message. Status report: 0x%04X 0x%04X\n",
312 le16_to_cpu(status
.magic
), le16_to_cpu(status
.code
));
315 if (status
.magic
!= cpu_to_le16(UCMB_MAGIC
))
317 err
= ucmb_status_code_to_errno(le16_to_cpu(status
.code
));
322 free_page((unsigned long)buf
);
324 mutex_unlock(&ucmb
->mutex
);
326 return err
? err
: size
;
329 static int __devinit
ucmb_probe(struct platform_device
*pdev
)
331 struct ucmb_platform_data
*pdata
;
334 const int bus_num
= ucmb_spi_busnum_count
++;
335 struct spi_bitbang
*bb
;
337 pdata
= pdev
->dev
.platform_data
;
341 ucmb
= kzalloc(sizeof(struct ucmb
), GFP_KERNEL
);
344 mutex_init(&ucmb
->mutex
);
345 ucmb
->msg_delay_ms
= pdata
->msg_delay_ms
;
346 ucmb
->gpio_reset
= pdata
->gpio_reset
;
347 ucmb
->reset_activelow
= pdata
->reset_activelow
;
349 /* Create the SPI GPIO bus master. */
351 #ifdef CONFIG_SPI_GPIO_MODULE
352 err
= request_module("spi_gpio");
354 printk(KERN_WARNING PFX
"Failed to request spi_gpio module\n");
355 #endif /* CONFIG_SPI_GPIO_MODULE */
357 ucmb
->spi_gpio_pdata
.sck
= pdata
->gpio_sck
;
358 ucmb
->spi_gpio_pdata
.mosi
= pdata
->gpio_mosi
;
359 ucmb
->spi_gpio_pdata
.miso
= pdata
->gpio_miso
;
360 ucmb
->spi_gpio_pdata
.num_chipselect
= 1;
362 ucmb
->spi_gpio_pdev
.name
= "spi_gpio";
363 ucmb
->spi_gpio_pdev
.id
= bus_num
;
364 ucmb
->spi_gpio_pdev
.dev
.platform_data
= &ucmb
->spi_gpio_pdata
;
366 err
= platform_device_register(&ucmb
->spi_gpio_pdev
);
368 printk(KERN_ERR PFX
"Failed to register SPI-GPIO platform device\n");
371 bb
= platform_get_drvdata(&ucmb
->spi_gpio_pdev
);
372 if (!bb
|| !bb
->master
) {
373 printk(KERN_ERR PFX
"No bitbanged master device found.\n");
374 goto err_unreg_spi_gpio_pdev
;
377 /* Create the SPI device. */
379 ucmb
->sdev
= spi_alloc_device(bb
->master
);
381 printk(KERN_ERR PFX
"Failed to allocate SPI device\n");
382 goto err_unreg_spi_gpio_pdev
;
384 ucmb
->sdev
->max_speed_hz
= pdata
->max_speed_hz
;
385 ucmb
->sdev
->chip_select
= 0;
386 ucmb
->sdev
->mode
= pdata
->mode
;
387 strlcpy(ucmb
->sdev
->modalias
, "ucmb", /* We are the SPI driver. */
388 sizeof(ucmb
->sdev
->modalias
));
389 ucmb
->sdev
->controller_data
= (void *)pdata
->gpio_cs
;
390 err
= spi_add_device(ucmb
->sdev
);
392 printk(KERN_ERR PFX
"Failed to add SPI device\n");
393 goto err_free_spi_device
;
396 /* Initialize the RESET line. */
398 if (pdata
->gpio_reset
!= UCMB_NO_RESET
) {
399 err
= gpio_request(pdata
->gpio_reset
, pdata
->name
);
402 "Failed to request RESET GPIO line\n");
403 goto err_unreg_spi_device
;
405 err
= gpio_direction_output(pdata
->gpio_reset
,
406 pdata
->reset_activelow
);
409 "Failed to set RESET GPIO direction\n");
410 goto err_free_reset_gpio
;
412 ucmb_reset_microcontroller(ucmb
);
415 /* Create the Misc char device. */
417 ucmb
->mdev
.minor
= MISC_DYNAMIC_MINOR
;
418 ucmb
->mdev
.name
= pdata
->name
;
419 ucmb
->mdev
.parent
= &pdev
->dev
;
420 ucmb
->mdev_fops
.read
= ucmb_read
;
421 ucmb
->mdev_fops
.write
= ucmb_write
;
422 ucmb
->mdev_fops
.ioctl
= ucmb_ioctl
;
423 ucmb
->mdev
.fops
= &ucmb
->mdev_fops
;
425 err
= misc_register(&ucmb
->mdev
);
427 printk(KERN_ERR PFX
"Failed to register miscdev %s\n",
429 goto err_free_reset_gpio
;
432 platform_set_drvdata(pdev
, ucmb
);
434 printk(KERN_INFO PFX
"Registered message bus \"%s\"\n", pdata
->name
);
439 if (pdata
->gpio_reset
!= UCMB_NO_RESET
)
440 gpio_free(pdata
->gpio_reset
);
441 err_unreg_spi_device
:
442 spi_unregister_device(ucmb
->sdev
);
444 spi_dev_put(ucmb
->sdev
);
445 err_unreg_spi_gpio_pdev
:
446 platform_device_unregister(&ucmb
->spi_gpio_pdev
);
453 static int __devexit
ucmb_remove(struct platform_device
*pdev
)
455 struct ucmb
*ucmb
= platform_get_drvdata(pdev
);
458 err
= misc_deregister(&ucmb
->mdev
);
460 printk(KERN_ERR PFX
"Failed to unregister miscdev %s\n",
463 if (ucmb
->gpio_reset
!= UCMB_NO_RESET
)
464 gpio_free(ucmb
->gpio_reset
);
465 spi_unregister_device(ucmb
->sdev
);
466 spi_dev_put(ucmb
->sdev
);
467 platform_device_unregister(&ucmb
->spi_gpio_pdev
);
470 platform_set_drvdata(pdev
, NULL
);
475 static struct platform_driver ucmb_driver
= {
478 .owner
= THIS_MODULE
,
481 .remove
= __devexit_p(ucmb_remove
),
484 static int ucmb_modinit(void)
486 struct ucmb_platform_data
*pdata
;
487 struct platform_device
*pdev
;
490 printk(KERN_INFO
"Microcontroller message bus driver\n");
492 err
= platform_driver_register(&ucmb_driver
);
494 printk(KERN_ERR PFX
"Failed to register platform driver\n");
497 err
= spi_register_driver(&ucmb_spi_driver
);
499 printk(KERN_ERR PFX
"Failed to register SPI driver\n");
500 platform_driver_unregister(&ucmb_driver
);
504 for (i
= 0; i
< ARRAY_SIZE(ucmb_list
); i
++) {
505 pdata
= &ucmb_list
[i
];
507 pdev
= platform_device_alloc("ucmb", i
);
509 printk(KERN_ERR PFX
"Failed to allocate platform device.\n");
512 err
= platform_device_add_data(pdev
, pdata
, sizeof(*pdata
));
514 printk(KERN_ERR PFX
"Failed to add platform data.\n");
515 platform_device_put(pdev
);
518 err
= platform_device_add(pdev
);
520 printk(KERN_ERR PFX
"Failed to register platform device.\n");
521 platform_device_put(pdev
);
529 module_init(ucmb_modinit
);
531 static void ucmb_modexit(void)
533 struct ucmb_platform_data
*pdata
;
536 for (i
= 0; i
< ARRAY_SIZE(ucmb_list
); i
++) {
537 pdata
= &ucmb_list
[i
];
540 platform_device_unregister(pdata
->pdev
);
541 platform_device_put(pdata
->pdev
);
544 spi_unregister_driver(&ucmb_spi_driver
);
545 platform_driver_unregister(&ucmb_driver
);
547 module_exit(ucmb_modexit
);