| 120 | } |
| 121 | |
| 122 | rt_err_t rt_led_register(struct rt_led_device *led) |
| 123 | { |
| 124 | rt_err_t err; |
| 125 | int device_id; |
| 126 | const char *dev_name; |
| 127 | struct blink_timer *btimer = RT_NULL; |
| 128 | |
| 129 | if (!led || !led->ops) |
| 130 | { |
| 131 | return -RT_EINVAL; |
| 132 | } |
| 133 | |
| 134 | if ((device_id = rt_dm_ida_alloc(&led_ida)) < 0) |
| 135 | { |
| 136 | return -RT_EFULL; |
| 137 | } |
| 138 | |
| 139 | rt_dm_dev_set_name(&led->parent, "led%u", device_id); |
| 140 | dev_name = rt_dm_dev_get_name(&led->parent); |
| 141 | |
| 142 | led->sysdata = RT_NULL; |
| 143 | rt_spin_lock_init(&led->spinlock); |
| 144 | |
| 145 | if (!led->ops->set_period && led->ops->set_state) |
| 146 | { |
| 147 | btimer = rt_malloc(sizeof(*btimer)); |
| 148 | |
| 149 | if (!btimer) |
| 150 | { |
| 151 | LOG_E("%s create blink timer failed", dev_name); |
| 152 | |
| 153 | err = -RT_ENOMEM; |
| 154 | goto _fail; |
| 155 | } |
| 156 | |
| 157 | led->sysdata = btimer; |
| 158 | |
| 159 | btimer->toggle = RT_FALSE; |
| 160 | btimer->enabled = RT_FALSE; |
| 161 | rt_timer_init(&btimer->timer, dev_name, _led_blink_timerout, led, |
| 162 | rt_tick_from_millisecond(500), RT_TIMER_FLAG_PERIODIC); |
| 163 | } |
| 164 | |
| 165 | led->parent.type = RT_Device_Class_Char; |
| 166 | #ifdef RT_USING_DEVICE_OPS |
| 167 | led->parent.ops = &_led_ops; |
| 168 | #else |
| 169 | led->parent.read = _led_read; |
| 170 | led->parent.write = _led_write; |
| 171 | #endif |
| 172 | led->parent.master_id = led_ida.master_id; |
| 173 | led->parent.device_id = device_id; |
| 174 | |
| 175 | if ((err = rt_device_register(&led->parent, dev_name, RT_DEVICE_FLAG_RDWR))) |
| 176 | { |
| 177 | goto _fail; |
| 178 | } |
| 179 |
no test coverage detected