rtt更新
This commit is contained in:
@@ -360,9 +360,9 @@ rt_err_t rt_bus_remove_device(rt_device_t dev)
|
||||
}
|
||||
else if (drv)
|
||||
{
|
||||
if (drv->shutdown)
|
||||
if (drv->remove)
|
||||
{
|
||||
err = drv->shutdown(dev);
|
||||
err = drv->remove(dev);
|
||||
}
|
||||
|
||||
/* device and driver are in the same bus */
|
||||
|
@@ -13,6 +13,8 @@
|
||||
* 2013-07-09 Grissiom add ref_count support
|
||||
* 2016-04-02 Bernard fix the open_flag initialization issue.
|
||||
* 2021-03-19 Meco Man remove rt_device_init_all()
|
||||
* 2024-09-15 milo fix log format issue
|
||||
* fix reopen with a different oflag issue
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
@@ -29,9 +31,9 @@
|
||||
#include <rtdevice.h> /* for wqueue_init */
|
||||
#endif /* RT_USING_POSIX_DEVIO */
|
||||
|
||||
#ifdef RT_USING_DFS_V2
|
||||
#if defined (RT_USING_DFS_V2) && defined (RT_USING_DFS_DEVFS)
|
||||
#include <devfs.h>
|
||||
#endif /* RT_USING_DFS_V2 */
|
||||
#endif /* RT_USING_DFS_V2 RT_USING_DFS_DEVFS */
|
||||
|
||||
#ifdef RT_USING_DEVICE
|
||||
|
||||
@@ -82,7 +84,7 @@ rt_err_t rt_device_register(rt_device_t dev,
|
||||
rt_wqueue_init(&(dev->wait_queue));
|
||||
#endif /* RT_USING_POSIX_DEVIO */
|
||||
|
||||
#ifdef RT_USING_DFS_V2
|
||||
#if defined (RT_USING_DFS_V2) && defined (RT_USING_DFS_DEVFS)
|
||||
dfs_devfs_device_add(dev);
|
||||
#endif /* RT_USING_DFS_V2 */
|
||||
|
||||
@@ -163,7 +165,7 @@ void rt_device_destroy(rt_device_t dev)
|
||||
{
|
||||
/* parameter check */
|
||||
RT_ASSERT(dev != RT_NULL);
|
||||
RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
|
||||
RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Null);
|
||||
RT_ASSERT(rt_object_is_systemobject(&dev->parent) == RT_FALSE);
|
||||
|
||||
rt_object_detach(&(dev->parent));
|
||||
@@ -195,8 +197,8 @@ rt_err_t rt_device_init(rt_device_t dev)
|
||||
result = device_init(dev);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
LOG_E("To initialize device:%s failed. The error code is %d",
|
||||
dev->parent.name, result);
|
||||
LOG_E("To initialize device:%.*s failed. The error code is %d",
|
||||
RT_NAME_MAX, dev->parent.name, result);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -233,8 +235,8 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)
|
||||
result = device_init(dev);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
LOG_E("To initialize device:%s failed. The error code is %d",
|
||||
dev->parent.name, result);
|
||||
LOG_E("To initialize device:%.*s failed. The error code is %d",
|
||||
RT_NAME_MAX, dev->parent.name, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -252,7 +254,7 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)
|
||||
|
||||
/* device is not opened or opened by other oflag, call device_open interface */
|
||||
if (!(dev->open_flag & RT_DEVICE_OFLAG_OPEN) ||
|
||||
((dev->open_flag & RT_DEVICE_OFLAG_MASK) != (oflag & RT_DEVICE_OFLAG_MASK)))
|
||||
((dev->open_flag & RT_DEVICE_OFLAG_MASK) != ((oflag & RT_DEVICE_OFLAG_MASK) | RT_DEVICE_OFLAG_OPEN)))
|
||||
{
|
||||
if (device_open != RT_NULL)
|
||||
{
|
||||
|
@@ -53,6 +53,137 @@ void rt_dm_secondary_cpu_init(void)
|
||||
}
|
||||
#endif /* RT_USING_SMP */
|
||||
|
||||
/**
|
||||
* @brief This function will alloc an id in an IDA object
|
||||
*
|
||||
* @param ida is the IDA object
|
||||
*
|
||||
* @return the id or -RT_EEMPTY
|
||||
*/
|
||||
int rt_dm_ida_alloc(struct rt_dm_ida *ida)
|
||||
{
|
||||
int id;
|
||||
RT_ASSERT(ida != RT_NULL);
|
||||
|
||||
rt_spin_lock(&ida->lock);
|
||||
|
||||
id = rt_bitmap_next_clear_bit(ida->map, 0, RT_DM_IDA_NUM);
|
||||
|
||||
if (id != RT_DM_IDA_NUM)
|
||||
{
|
||||
rt_bitmap_set_bit(ida->map, id);
|
||||
}
|
||||
|
||||
rt_spin_unlock(&ida->lock);
|
||||
|
||||
if (id != RT_DM_IDA_NUM)
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
return -RT_EEMPTY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function will take (force) an id in an IDA object
|
||||
*
|
||||
* @param ida is the IDA object
|
||||
*
|
||||
* @param id is the id that want to take
|
||||
*
|
||||
* @return the result of taking
|
||||
*/
|
||||
rt_bool_t rt_dm_ida_take(struct rt_dm_ida *ida, int id)
|
||||
{
|
||||
RT_ASSERT(ida != RT_NULL);
|
||||
RT_ASSERT(id >= 0);
|
||||
|
||||
rt_spin_lock(&ida->lock);
|
||||
|
||||
if (!rt_bitmap_test_bit(ida->map, id))
|
||||
{
|
||||
rt_bitmap_set_bit(ida->map, id);
|
||||
}
|
||||
else
|
||||
{
|
||||
id = RT_DM_IDA_NUM;
|
||||
}
|
||||
|
||||
rt_spin_unlock(&ida->lock);
|
||||
|
||||
return id != RT_DM_IDA_NUM;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function will release an id in an IDA object
|
||||
*
|
||||
* @param ida is the IDA object
|
||||
*
|
||||
* @param id is the id of IDA object
|
||||
*/
|
||||
void rt_dm_ida_free(struct rt_dm_ida *ida, int id)
|
||||
{
|
||||
RT_ASSERT(ida != RT_NULL);
|
||||
RT_ASSERT(id >= 0);
|
||||
|
||||
rt_spin_lock(&ida->lock);
|
||||
|
||||
rt_bitmap_clear_bit(ida->map, id);
|
||||
|
||||
rt_spin_unlock(&ida->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function will return the specified master id and device id of device.
|
||||
*
|
||||
* @param master_id is the master id (0, 255] of device
|
||||
*
|
||||
* @param device_id is the device id [-1, 255] of device, when device_id is -1,
|
||||
* the function will end when find the first device.
|
||||
*
|
||||
* @return the device object or RT_NULL
|
||||
*/
|
||||
rt_device_t rt_dm_device_find(int master_id, int device_id)
|
||||
{
|
||||
struct rt_device *dev, *ret_dev = RT_NULL;
|
||||
struct rt_object_information *information = RT_NULL;
|
||||
|
||||
if (master_id <= 0 || device_id > 255)
|
||||
{
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
information = rt_object_get_information(RT_Object_Class_Device);
|
||||
|
||||
/* parameter check */
|
||||
if (!information)
|
||||
{
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
/* which is invoke in interrupt status */
|
||||
RT_DEBUG_NOT_IN_INTERRUPT;
|
||||
|
||||
/* enter critical */
|
||||
rt_enter_critical();
|
||||
|
||||
/* try to find object */
|
||||
rt_list_for_each_entry(dev, &information->object_list, parent.list)
|
||||
{
|
||||
if (master_id == dev->master_id &&
|
||||
(device_id == -1 || device_id == dev->device_id))
|
||||
{
|
||||
ret_dev = dev;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* leave critical */
|
||||
rt_exit_critical();
|
||||
|
||||
return ret_dev;
|
||||
}
|
||||
|
||||
struct prefix_track
|
||||
{
|
||||
rt_list_t list;
|
||||
|
@@ -78,21 +78,21 @@ static rt_bool_t platform_match(rt_driver_t drv, rt_device_t dev)
|
||||
{
|
||||
struct rt_platform_driver *pdrv = rt_container_of(drv, struct rt_platform_driver, parent);
|
||||
struct rt_platform_device *pdev = rt_container_of(dev, struct rt_platform_device, parent);
|
||||
|
||||
#ifdef RT_USING_OFW
|
||||
struct rt_ofw_node *np = dev->ofw_node;
|
||||
|
||||
/* 1、match with ofw node */
|
||||
if (np)
|
||||
{
|
||||
#ifdef RT_USING_OFW
|
||||
pdev->id = rt_ofw_node_match(np, pdrv->ids);
|
||||
|
||||
#else
|
||||
pdev->id = RT_NULL;
|
||||
#endif
|
||||
if (pdev->id)
|
||||
{
|
||||
return RT_TRUE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 2、match with name */
|
||||
if (pdev->name && pdrv->name)
|
||||
@@ -123,7 +123,13 @@ static rt_err_t platform_probe(rt_device_t dev)
|
||||
|
||||
if (err && err != -RT_EEMPTY)
|
||||
{
|
||||
LOG_E("Attach power domain error = %s in device %s", pdev->name, rt_strerror(err));
|
||||
LOG_E("Attach power domain error = %s in device %s", rt_strerror(err),
|
||||
#ifdef RT_USING_OFW
|
||||
(pdev->name && pdev->name[0]) ? pdev->name : rt_ofw_node_full_name(np)
|
||||
#else
|
||||
pdev->name
|
||||
#endif
|
||||
);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@@ -17,6 +17,7 @@
|
||||
#include <drivers/ofw_io.h>
|
||||
#include <drivers/ofw_fdt.h>
|
||||
#include <drivers/platform.h>
|
||||
#include <drivers/core/bus.h>
|
||||
#include <drivers/core/dm.h>
|
||||
|
||||
#include "../ofw/ofw_internal.h"
|
||||
@@ -161,6 +162,7 @@ static rt_err_t platform_ofw_device_probe_once(struct rt_ofw_node *parent_np)
|
||||
}
|
||||
|
||||
pdev->dev_id = ofw_alias_node_id(np);
|
||||
np->dev = &pdev->parent;
|
||||
LOG_D("%s register to bus", np->full_name);
|
||||
|
||||
rt_platform_device_register(pdev);
|
||||
@@ -199,6 +201,53 @@ rt_err_t rt_platform_ofw_device_probe_child(struct rt_ofw_node *np)
|
||||
return err;
|
||||
}
|
||||
|
||||
rt_err_t rt_platform_ofw_request(struct rt_ofw_node *np)
|
||||
{
|
||||
rt_err_t err;
|
||||
|
||||
if (np)
|
||||
{
|
||||
struct rt_device *dev = np->dev;
|
||||
|
||||
if (dev)
|
||||
{
|
||||
/* Was create */
|
||||
if (dev->drv)
|
||||
{
|
||||
/* Was probe OK */
|
||||
err = RT_EOK;
|
||||
}
|
||||
else
|
||||
{
|
||||
err = rt_bus_reload_driver_device(dev->bus, dev);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
struct rt_platform_device *pdev = alloc_ofw_platform_device(np);
|
||||
|
||||
if (pdev)
|
||||
{
|
||||
pdev->dev_id = ofw_alias_node_id(np);
|
||||
np->dev = &pdev->parent;
|
||||
LOG_D("%s register to bus", np->full_name);
|
||||
|
||||
err = rt_platform_device_register(pdev);
|
||||
}
|
||||
else
|
||||
{
|
||||
err = -RT_ENOMEM;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
err = -RT_EINVAL;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int platform_ofw_device_probe(void)
|
||||
{
|
||||
rt_err_t err = RT_EOK;
|
||||
@@ -206,6 +255,8 @@ static int platform_ofw_device_probe(void)
|
||||
|
||||
if (ofw_node_root)
|
||||
{
|
||||
rt_ofw_node_get(ofw_node_root);
|
||||
|
||||
err = platform_ofw_device_probe_once(ofw_node_root);
|
||||
|
||||
rt_ofw_node_put(ofw_node_root);
|
||||
@@ -216,11 +267,19 @@ static int platform_ofw_device_probe(void)
|
||||
rt_ofw_node_put(node);
|
||||
}
|
||||
|
||||
if ((node = rt_ofw_find_node_by_path("/clocks")))
|
||||
{
|
||||
platform_ofw_device_probe_once(node);
|
||||
rt_ofw_node_put(node);
|
||||
}
|
||||
|
||||
rt_ofw_node_get(ofw_node_chosen);
|
||||
if ((node = rt_ofw_get_child_by_compatible(ofw_node_chosen, "simple-framebuffer")))
|
||||
{
|
||||
platform_ofw_device_probe_once(node);
|
||||
rt_ofw_node_put(node);
|
||||
}
|
||||
rt_ofw_node_get(ofw_node_chosen);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -244,7 +303,7 @@ rt_err_t rt_platform_ofw_free(struct rt_platform_device *pdev)
|
||||
rt_ofw_node_clear_flag(np, RT_OFW_F_PLATFORM);
|
||||
rt_ofw_node_put(np);
|
||||
|
||||
pdev->parent.ofw_node = RT_NULL;
|
||||
rt_free(pdev);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user